攻防世界-favorite_number
老樣子進入環境,一段代碼刷刷下來,闖進腦子里
?這里就需要具備php語言的基礎了,還有正則的基礎,還不會的小伙伴,趕緊補一補
(注意php5.5.9這個版本)
分析一下代碼:
if($stuff === $array && $stuff[0] != 'admin')? //數組判斷,強等于,首元素需要不等于 'admin'
if (preg_match("/^\d+$/im",$num))? //只允純數字, 看到謀面的/m了吧,這是開啟了多行匹配,所以呢
^和$不只是字符串匹配開頭和結尾,這就是匹配每一行的開頭和結尾. 用%a0換行,這樣正則匹配就只能匹配到第一行.
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num))
// 這里相當于一個黑名單,不允許有我們常用的可以執行的代碼命令,把它們都過濾掉了
主要的代碼部分都清楚了,步驟就繞過這三個if 執行里面的system
?
這第一給if就給我難住了,想了很久,要不然就是溢出,要不就是php5.5.9這個版本有什么漏洞,不然怎么構造payload 我也繞不過去,去逛了一圈,看到了一些資料,php5.5.26這版本有個整數溢出漏洞
小伙伴可以自己看一看: https://bugs.php.net/bug.php?id=69892
漏洞就是說數組中鍵值為0的元素與4294967296 //0x100000000 (0x開頭表示16進制,換算過來就是4294967296)的元素是一樣的
所以我們構造payload先繞過第一個if:
stuff[4294967296]=admin&stuff[1]=user&num=666
?第一個if繞過
第二個if后面加%0a加ls /查看根目錄
看到flag字樣了,cat /flag貓一眼
?好家伙,被過濾掉了,那么就要想想別的辦法看了
https://blog.csdn.net/weixin_42373789/article/details/113451481可以參考參考繞過姿勢,加上自己奇思妙想
stuff%5B4294967296%5D=admin&stuff%5B1%5D=user&num=666%0a ca``t? /fl``ag
?成功拿到flag,打完收工!
?
總結
以上是生活随笔為你收集整理的攻防世界-favorite_number的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小谈星际的操作与APM
- 下一篇: -sql语法-2-部门表