"白帽子社區在線CTF靶場BMZCTF,歡迎各位在這裡練習、學習,BMZCTF全身心為網絡安全賽手提供優質學習環境,連結(http://www.bmzclub.cn/)
"
在php中可由用戶輸入的變量$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES存在命令注入的函數systemexecpassthrushell_execpopenproc_openpcntl_exec存在XSS和CSRF的函數
echoprintprintfvprintf<%=$test%>存在文件包含的函數
includeinclude_oncerequirerequire_onceshow_sourcehighlite_filereadfileflie_get_contentsfopen
存在代碼注入的函數evalpreg_replaceassertcall_user_funccall_user_func_arraycreate_function存在SQL注入的語句
文件管理函數
copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contentsfreadreadfileftruncatefile_put_contentsfputcsvfputs對於此類函數,可以使用php偽協議進行一個繞過。
<?php$a=$_GET['a'];if(stripos($a,'.')){ echo 'no'; return ;}$data = @file_get_contents($a,'r');if($data=="WHT is a good family!"){ require("flag.txt"); echo "flag";}?>GET形式傳入參數a,a不能含有.,且變量a必須為WHT is a good family!
使用php偽協議進行一個傳參。
文件上傳函數變量覆蓋函數<?php $flag='flag.txt';extract($_GET); if(isset($a)) { $content=trim(file_get_contents($flag)); if($a==$content) { echo'ctf{xxx}'; } else { echo'no'; } } ?>"extract($_GET)"此函數將GET傳入的參數都重新賦值了, $content的值為flag.txt的內容,只有a和content的值相等時,才會輸出flag,所以將$flag賦值一個不存在的文件,那麼$content的值也就為空,此時$content也就變的可控了。
POC:
Session繞過<?php $flag = "flag{xxxx}"; session_start();if (isset ($_GET['password'])) { if ($_GET['password'] == $_SESSION['password']) die ('Flag: '.$flag); else print 'Wrong';}mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));?>Session的password在未登陸時為空,我們只要上傳一個空的paasword即可繞過。
比較相等繞過MD5md5('240610708')==md5('QNKCDZO')md5('aabg7XSs')==md5('aabC9RqS')SHA1sha1('aaroZmOk')==sha1('aaK1STfY')sha1('aaO8zKZF')==sha1('aa3OFF9m')明文'0010e2'=='1e3''0x1234Ab'=='1193131''0xABCdef'==' 0xABCdef'弱類型整型比較<?php error_reporting(0);$flag = "flag{test}"; $temp = $_GET['password'];is_numeric($temp)?die("no numeric"); if($temp>1336){ echo $flag;} ?>當一個整形和一個其他類型行比較的時候,會先把其他類型intval再比。
POC:
MD5函數true繞過$password = $_GET['password'];$sql = "SELECT * FROM users WHERE password = '".md5($password,true)."'";ffifdyop
preg_match繞過 1.數組繞過
129581926211651571912466741651878684928
2.回溯次數限制繞過
3.添加換行符 \n 和 %0astrpos()繞過strpos()找的是字符串,那麼傳一個數組給它,strpos()出錯返回null。
sha1()繞過<?php $flag = "flag{xxxx}"; if (isset($_GET['name']) and isset($_GET['password'])){ if ($_GET['name'] == $_GET['password']) echo 'Your password can not be your name!'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo 'Invalid password.';}else echo 'Login first!';?>需要構造一對哈希值相等但明文不同的字符串,這裡sha1函數無法處理數組,當處理數組時會報錯返回False,這樣就使得2個參數的哈希值「相等」,這裡傳參2個不同的數組即可繞過所有if。MD5碰撞PHP在處理哈希字符串時,會利用」!=」或」==」來對哈希值進行比較,它把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。
0e開頭的md5和原值:QNKCDZO0e830400451993494058024219903391QNKCDZO0e8304004519934940580242199033912406107080e462097431906509019562988736854s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675
PHP版本存在漏洞的函數
User-Agentt: zerodiumsystem("cat /flag");值不等MD5相等,用兩個不能MD5轉換的值就可以。
傳數組,strcmp()用兩個無法比較的值,數組和字符串不可比較。