这里由于实验的时候只记录了一部分因此就展现一部分前端
(1)看到界面发现是查询id功能,没有在url里看到有传参因此应该是post方法提交数据。mysql
(2)进行sql注入以前咱们最好是先想像一下这个功能提交的参数到了后台以后后台是怎样的操做的,对于当前的页面我猜想后台是这样操做sql
现接受个人id请求而后带入到查询语句数据库
$id=$_POST['id']数组
select 字段1,字段2 from 表名 where id = $id网络
能够用下面的语句添加在等号后面来测试是否真确(post请求经过抓包的方式来进行测试)函数
1 or 1=1;工具
能够看到返回的是200post
而后查看返回的结果能够看到把全部的结果都查询出来了。因此有漏洞而且是数字型的测试
查看页面发现是get请求
(1)首先也是猜测后台进行的操做,由于是查询名字,先将咱们查询的数值赋给一个变量
$uname=$_GET['username']
select 字段1,字段2 from 表名 where username='$uname ' or 1=1#';
or = 1=1#验证漏洞是否存在,#号注释闭合‘’
测试结果
(1)搜索型
看到界面是用户名查找我首先仍是进行猜想后台的操做,猜想后台可能使用的是mysql的搜索功能,mysql查询语句
Select * from member where username like ’$$’;
对于咱们渗透者来时要进行一个闭合构造
Payload:xxxx%' or 1=1 #
测试结果
(2)xx型
查看页面发现与搜索型相似,可是测试发现拼接闭合的语句不一样,查看源码发现是括号闭合,因此能够获得payload的类型是多种多样的。
原理方法与搜索型相似,因此构造payload
xx') or 1=1 #
但实际渗透测试过程当中不可能获得目标网站的源码,这时候就须要根据经验和多测试。好比发现一个输入框,就首先进行单双引号测试
aaa” or 1=1# 或者 aaa’or 1=1#等等等。
主要是经过输入来看返回,来看咱们的输入有没有参与到数据库后台的运算里面.
(1)insert
看到界面发现是注册猜想后台数据库操做应该是insert命令,咱们点击注册,咱们先进行单引号测试
提交发现出现错误意味着提交的语法在后台参与了操做。
而后咱们得知道mysqlinsert语句的用法
Insert into member(username,pw,sex,phonenum,email,address)values(‘xxxxxxxx’11111,1,2,3,4);
要构造闭合首先在咱们能够输入的部分就是‘xxxx’里插入报错函数
Updatexml()
kobe' and updatexml(1,version(),0)#
updataxml(是mysql对xml文档函数进行出巡和修改的Xpath函数)
函数有三个参数第一个数指定xml文档表的字段名称,第二个是指定要替换的位置,第三个是新的值,但这三个值都是错误的。
第一个是不存在的,最后一个0由于前面的是不存在的因此替换也是没有意义的。关键是中间的数值,中间的数值也能够用表达式的形式,函数会把这个表达式执行了而后以报错的形式返回出来。
测试
发现没有返回完整的版本号信息,这里由于咱们没有进行处理。
这里咱们对函数进行处理加入concat函数意思是将传进去的参数组合成一个字符串打印出来,concat也能够执行表达式也就是将 0x7e和version()结果组合成一个字符串打印出来
kobe' and updatexml(1,concat(0x7e,version()),0)#
kobe' and updatexml(1,concat(0x7e,database()),0)#
0x7e是~号的十六进制
测试:
xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
发现成功返回报错打印数据库名称
(2)update
首先登录以后发现能够修改我的信息
Update语法与insert差很少咱们将以前的palyload输入
xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
提交测试:
发现同样能够返回报错
首先看到界面有请求和删除功能咱们点击删除,以后再burp上查看
猜想由于对于后台来讲其实就是获取了id,而后进行删除操做,因此咱们就对id进行操做,仍是使用以前的updatexml函数构造payload
1 or updatexml(1,concat(0x7e,database()),0)
将payload带入burp里面,由于参数是url类型进行提交的因此要进行URL编码
能够看到空格都变成了+号
最后看返回
成功报错。
Base time注入输入单引号不会返回报错,通常方法也不会返回报错,
这时候咱们猜想是否为base time 的注入
先打开控制台f12选择网络
而后输入payload:kobe' and sleep(5)#
发现执行了咱们的语句延迟五秒,证实存在base time的注入
而后就能够构造咱们的payload
kobe' and if((substr(database(),1,1))='a',sleep(5),null)#
经过一个if语句让数据库名称的第一个字符与a进行比较,若是同样就会暂停五秒,若是不等于就为假不暂停。
而后就慢慢进行尝试
1.基于boolean的与基于time的同样,用以前的方法都不会返回报错。
2.不论是输入正确,仍是输入错误,都只显示两种状况(能够认为是0或者1)
3.在输入正确的状况下,输入and1=1/and1=2发现能够判断
测试,经过输入正确的名字加上咱们的语句and 1=1#发现,也成功返回信息。
而后输入kobe' and 1=2#,发现有报错,断定是存在sql注入的,可是前端返回信息特别少。用我以前的报错函数payload输入也不能得到报错。怎么办呢。
办法总比困难多
这里咱们使用一个这里substr函数,先了解什么是substr函数
Select substr(database(),1,1);
意思是使用取出数据库名称的第一个字符一次取出一个。
那咱们如何知道要猜的名称长度,这里再用一个函数,length得到长度,可是基于boolean函数的只能返回真假因此
Length(database())>8,经过这种方式来猜,
(1)测试payload
kobe' and ascii(substr(database(),1,1))>113#
前面为真若是and后面也为真就会返回kobe的信息,根据真假来判断咱们的猜想
先去猜想数据库第一个字符的ascii码大于113
返回为假
再次猜想
kobe' and ascii(substr(database(),1,1))=112#
返回为真。
如今进行进一步构造payload
将database()替换为查找数据库里第一个表的表名,以后再去一个个判断字符
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<112#
返回为真,说明数据库第一个表的表名的第一个字符的ASCII码小于112,而后以此类推就能够猜到完整的。
手工盲注效率仍是很慢,因此咱们只须要搞懂原理,在实际测试的过程当中仍是须要自动化的工具,例如sqlmap之类的,因为以前测试的时候没有记录,这里就不演示了。