目录
代码
不可以使用大小写字母、数字和$然后实现eval的注入执行
php
<?php
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>35){
die("Long.");
}
if(preg_match("/[A-Za-z0-9_$]+/",$code)){
die("NO.");
}
eval($code);
}else{
highlight_file(__FILE__);
}
payload构造
php7
在PHP7中我们可以使用('phpinfo')(),这样的代码执行,如下图
但是我们如果直接使用('phpinfo')()因为有英文,所以我们可以尝试使用取反绕过,如下
先取反
再进行注入,将刚刚取反的字符串在地址栏中再次取反,当然不止可以执行phpinfo可以执行任意php代码
php
http://192.168.244.152:8080/web.php?code=(~%8F%97%8F%96%91%99%90)();
php5
在php5中是不支持('phpinfo')()
所以在php5中我们就要换一种绕过方式。抓取php的临时文件,**然后要用code参数匹配到临时文件,然后放到eval上,然让eval执行系统命令(这里临时文件是不会删除的因为php程序没有走完走完才会删除临时文件)。**在PHP中,当通过POST方法提交大型数据时,PHP会将提交的数据暂存到临时文件中,而不是保存在内存中。这时我们可以通过抓取临时文件执行临时文件的内容。但是抓取临时文件很难因为你上传上去后,没有接收文件,系统就会很快的删除掉你的文件,然后想要接收文件还需要知道文件名字,但是文件名是一个随机字符没有用办法接到。所以我们可以使用一些过滤方法来获取文件名字。
下面我们来看一下临时文件长什么样子,并尝试执行临时文件
首先修改php配置文件
尝试进行post传参:
get.html文件
test.php文件
尝试上传
然后我们在要上传的文件写我们的系统执行命令。如果可以访问并执行临时文件,就可以进行命令执行了,我们在要上传的文件上写入你要执行的命令,如下图所示
下载来看一下在tml下的临时文件
使用. 临时文件名绕过加权限的步骤,如下图执行成功。
上面我们既然执行了临时文件,那么我们现在剩下的问题就是找到我们的临时文件,这样才可以在网站中进行命令执行。对于这道题目来说,我们要匹配临时文件是不可以使用英文和数字进行匹配的所以不可以/tmp/php*这样找。那应该如何进行临时文件名的查找呢,我们来看一下下面这个技巧。
首先说一下php的临时文件最后一个字母可能是大写字母(这个大写小写只有50%的概率),而在linux中文件后缀几乎就没有大写的字母。所以我们可以匹配最后一个大写字母,正好Linux中有一个叫做glob的通配符可以单独匹配大写字符
下面代码可以匹配在/有3位的文件夹下的/有9位并且最后一位还是的文件在ascii码中@-[之间就是大写字母
php
ls -al /???/????????[@-[]
构造payload
抓一个文件上传的包,抓这个包是为了改造web.php的包
抓取的web.php的数据包
改造web.php的包
先将web.php改成post传参方式
修改Content-Type字段,和复制传输内容,保持一致
添加get参数
这里?>的意思是eval有一个标签需要闭合,如下官方文档解释
代码不能包含打开/关闭 PHP tags。比如,
'echo "Hi!";'
不能这样传入:'<?php echo "Hi!"; ?>'
。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP 模式。比如'echo "In PHP mode!"; ?>In HTML mode!<?php echo "Back in PHP mode!";'
。
然后=的意思就相当于=,这是<?=
是 PHP 的短标签,用于输出一个表达式的值。它是 <?php echo
的简写
··反引号可以在eval中命令执行在这里的代码就是上面说的匹配上文件,再进行命令执行,然后由于这个是get传参所以需要需要进行url编码,不过这是再bp下所以转不转码都可以,然后就执行成功了
code=?><?=`. /???/????????[@-[]`;?>
在这个里面首先进行post提交产生临时文件,然后再传入get,只要程序不执行完临时文件就不会删除
结果忘记截图了