self php语法,PHP代码审计之关于PHP_SELF的简单利用
這兩天突然看到 https://blog.ripstech.com/2020/sql-injection-impresscms/,想著復現一下,記錄一下學習過程。
漏洞分析
漏洞復現
首先我們先下載安裝一下這個 cms,然后直接訪問:
http://127.0.0.1:81/admin.php/modules/system' and sleep(2) and '1
這個 url,會發現延遲了三秒,沒錯這個漏洞就是這么簡單。更深的用法我們就不討論了。
漏洞分析
打開 cms 的文件: \htdocs\libraries\icms\module\Handler.php,找到 service 函數:
static public function service($inAdmin = FALSE) {
if ($inAdmin || ... ) {
$url_arr = explode('/', strstr($_SERVER['PHP_SELF'], '/modules/'));
if (isset($url_arr[2])) {
//關鍵點
$module = icms::handler("icms_module")->getByDirname($url_arr[2], TRUE);
我們首先訪問 admin.php 會執行到這個函數,然后 inAdmin 會設置成 true,到第四行獲取了 PHP_SELF 并以 /modules/ 分割,然后講 /modules/ 后的內容帶入 getByDirname,跟進該函數:
public function getByDirname($dirname, $loadConfig = FALSE) {
if (!empty($this->_cachedModule[$dirname]) &&
$this->_cachedModule[$dirname]->getVar('dirname') == $dirname
) {
...
} else {
$sql = "SELECT * FROM " . $this->db->prefix('modules') . " WHERE dirname = '" . trim($dirname) . "'";
//執行sql
可以看到這里直接帶入了 $sql 沒有任何過濾。
擴展思考
之前我也審計到過一個此類的漏洞,這里順便分享一下:
然后下面的代碼:
//此處的 $uri 就是 PHP_SELF
$tmp = strtolower(substr($uri,-4));
if(in_array($tmp,array('.jpg','.gif','.png','jpeg')) && substr($uri,0,11) == 'res/_cache/'){
$tmp = substr($uri,11);
$tmp = explode("/",$tmp);
get_one($tmp[0]);
當文件名是 .jpg 結尾并且 uri 前十一位是 res/_cache/ 時進入,最后用 / 分割 uri 并帶入 sql 語句。
很容易就可以 payload:
index.php/res/_cache/a'-sleep(3)-'/test/test.jpg
此外還有一個點,但是暫時沒有見到過案例,比如:
print_r($_SERVER['REQUEST_URI']);
?>
這樣的代碼,然后我們用 bp 講 /test/test.php 修改成:/abc'd/../test/test.php
當然,不管是 PHP_SELF 還是 REQUEST_URI 我們直接 echo 出來都會造成 反射的 XSS
實際上我們訪問的依然是 test.php,但是 REQUEST_URI 輸出的卻是 /abc'd/../test/test.php。
當然,$_SERVER 里還有很多好玩的,期待師傅們挖掘出來教我QAQ
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的self php语法,PHP代码审计之关于PHP_SELF的简单利用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大麦创新 IDMIX 推出赛博移动电源:
- 下一篇: 奇迹所有转职任务攻略