1. 程式人生 > 實用技巧 >PHP-Audit-Labs 總結 (未完待續)

PHP-Audit-Labs 總結 (未完待續)

Day 1 in_array()弱型別繞過

說到底是個弱型別比較的問題,比如

$whitelist = array(0,1,2,3,4,5);
if (!in_array($id, $whitelist)) {
    die("id $id is not in whitelist.");
}

只要第一位是數字就可以繞過

Day 2 url繞過

filter_var($url, FILTER_VALIDATE_URL)parse_url()繞過
一些payload

demo://evil.com:80;sec-redclub.com:80/
demo://evil.com:80,sec-redclub.com:80/
http://localhost/index.php?url=http://[email protected]
http://localhost/index.php?url=http://demo.com&sec-redclub.com
http://localhost/index.php?url=http://demo.com?sec-redclub.com
http://localhost/index.php?url=http://demo.com/sec-redclub.com
http://localhost/index.php?url=demo://demo.com,sec-redclub.com
http://localhost/index.php?url=demo://demo.com:80;sec-redclub.com:80/
http://localhost/index.php?url=http://demo.com%23sec-redclub.com

Day 3 內建類SimpleXMLElement實現xxe

https://www.php.net/manual/zh/class.simplexmlelement.php

當可以例項化任意類時可以考慮這種方法,主要看SimpleXMLElement的構造方法

  • data,直接傳入xml字串。也可以傳入外部xml的url,前提是第三個引數data_is_urltrue
  • options,都是定義的常量,一般填個2就夠了
  • data_is_url預設false

PS:xml裡面一定要有文件元素,也就是最後引用的那一部分<foo>&xxe;</foo>,不然會報錯

Day 4 strpos弱型別繞過

不是strpos本身的問題,比如

if(!strpos($user,'<')){
    echo "ok";
}

當沒有找到時返回false,否則返回下標,如果要找的字元在第一個,下標為0,此時如果進行的是弱型別判斷的話,就會有問題

Day 5 escapeshellarg和escapeshellcmd同時使用繞過

escapeshellarg,將給字串增加一個單引號並且能引用或者轉碼任何已經存在的單引號
escapeshellcmd,會對以下的字元進行轉義&#;|*?~<>^()[]{}$, x0AxFF, '"僅在不配對的時候被轉義。

127.0.0.1' -v -d a=1
#escapeshellarg
'127.0.0.1'\'' -v -d a=1'
#escapeshellcmd
'127.0.0.1'\\'' -v -d a=1\'

Day 6 正則表示式及弱型別比較

沒什麼內容。
順便提一下正則表示式支援unicode和十六進位制,比如\x{0069}就是i
弱型別比較的時候可能用到

# "42" == password
password=42.00e+00000
password=420.00000e-1

正則表示式配置不當寫shell的問題可以看p神的文章經典寫配置漏洞與幾種變形

Day 7 parse_str變數覆蓋

extract$$一個道理