SQL注入之EVAL长度限制突破技巧

要求:

PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell?

widows小皮环境搭建:

使用phpstudy搭建一个网站。

随后在该eval文件夹下创建一个webshell.php文件,并在其输入代码环境

解题思路:

通过webshell.php的代码中我们可以看到,我们传递的一个param的参数长度小于17位,即长度最多十六位,而且里面不能包含eval和assert,最后eval执行。这就是这段代码的含义。

这个题的难度在于其的长度限制。

我们输入?param=phpinfo();查看页面为php正常。

但我们也就只有输入一个phpinfo();了,但是这只是在Windows下不行了,在Linux下继续接着尝试。

Linux环境搭建:

进入nginx下的html文件夹中创建一个web.php文件下输入代码。

cd /usr/local/nginx/html

vim web.php

:wq保存退出,在/usr/local/nginx/sbin下./nginx启动nginx。

浏览器进入该web.php。

再次解题:

输入?param=phpinfo();测试环境搭建成功。

但是跟解题无关,依然只是个php界面,啥用没有,我们输入?param=·$_GET[1]·&1=id,

id通过反引号执行,因为在Linux下反引号是可以执行命令的。

'$_GET[1]'&1=id,这个代码的意思就是将$_GET[1]中的1的参数放在Linux下执行,实际上执行的就是$_GET[id],而这17位主要是'$_GET[1]'这个不能突破17位,而后面的1=id随便写多少位都行。

发现没有任何执行显示,这是因为我们执行了但没有输出,只需在前面加上个echo和;即可,?param=echo `$_GET[1]`;&1=id

这就完成了我们的代码执行转换为了命令执行,再转为whoami查看我们的用户是谁。?param=echo `$_GET[1]`;&1=whoami

若是想要执行其他命令例如rm之类的不能执行到,因为权限不够。

比如我们在tmp下创建一个文件,?param=echo `$_GET[1]`;&1=touch /tmp/ceshi123.txt

在Linux中查看,创建成功,用户及权限都是www-data.

以上就是一个突破长度限制的一个内容,算是最简单的一种技巧,接触过第一次后,就很容易的想到这种办法了,当有长度限制的要求时,Windows下的环境一般不会有,因为大部分99%的公司企业环境都用的Linux,而当一看到长度限制只有几位操作空间的时候就可以想到Linux了。

其他技巧:

当然还有另一种稍微难点的技巧。

web.php?1=file_put_contents&param=$_GET[1](N,P,8);

web.php?1=file_put_contents&param=$_GET[1](N,D,8);

继续追加

web.php?1=file_put_contents&param=$_GET[1](N,w,8);

web.php?param=include$_GET[1];&1=php://filter/read=convert.b ase64-decode/resource=N

这里向param传入的$_GET[1],这个GET[1]接受的参数是file_put_contents,实际GET[1]中写的就是file_put_contents,这个file_put_contents里传了三个参数,N、P、8,N是我们要写的文件名,也就是我们要写进这个文件里去,P是我们一句话木马的一个base64编码,8代表着追加。我们输入web.php?1=file_put_contents&param=$_GET[1](N,P,8);后在Linux中的查看会发现多了一个N的文件,N文件中内容为P,再执行一个web.php?1=file_put_contents&param=$_GET[1](N,D,8);这其实就是将base64编码一个一个往N里面追加。但是在官方文档中这个8是FILE_APPEND,这样就超出长度限制了,根本用不了,8是因为php底层C语言代码中file_put_content函数中的追加是8,所以这里写的8而不是php官方文档中写的FILE_APPEND。这里就是写8的原因而不是写的其他。这里追加的是base64编码而不是其他编码是因为有些特殊字符在file_append中追加不了,比如^?等追加不了。读取是通过php的尾协议用base64-decode解码成一个正常的语句文件包含进去的N里面是可以识别的一句话木马。前提就是得一个一个追加完成后进行一个解码执行。

还有一个web.php?1[]=test&1[]=phpinfo();&2=assert。加上一个usort(...$_GET);即PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行,前提是要进行一个抓包,这里使用的是burpsuite抓包。

抓包结果如下。

对开头得GET修改为POST末尾追加param=usort(...$_GET);加;是因为要传入eval中得,这里usort(...$_GET);一共16位没有超过17位。

这里php5.6可以接收...GET变长参数,usort的回调后门去执行。

然后在action中send to repeater后在repeater中send就可以在旁边看到了。

以上三个方法就是EVAL长度限制突破技巧的一小部分技巧了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值