PHP-Audit-Labs 總結 (未完待續)
阿新 • • 發佈:2020-08-12
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_url
為true
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
,會對以下的字元進行轉義&#;|*?~<>^()[]{}$
, x0A
和 xFF
, '
和 "
僅在不配對的時候被轉義。
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
、$$
一個道理