一、二次注入
原理
在第一次进行数据库插入数据的时候,使用了addslashes等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 "\" 进行转义,但是 "\" 并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到数据库中之后,开发者会认为数据是可信的,在下一次进行查询的时候,直接从数据库中取出了脏数据。没有进行进一步的检验和处理,,这样就会造成SQL的二次注入。比如:在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中,然后在下一次使用中在拼接的过程中,就形成了二次注入。
整个注入过程需要执行两次
- 第一次仅仅是将恶意代码写入到数据库中。
- 第二次执行恶意代码【暴露数据,修改其他账号密码】
出现位置:
注册账号,修改密码
注册邮箱,修改密码添加文章,编辑文件
二、盲注
什么是盲注?
盲注是一种SQL注入的攻击方式,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注。
盲注分为三种:布尔盲注、时间盲注、报错盲注
其中布尔盲注,就是说我们在注入语句的后面加上一个布尔判断,就是判断真和假。如果说我们判断的条件成立了,页面依然显示正常,那么就说明这个代码执行了,如果后面的布尔判断不成立,页面显示错误了。那么结合这两个,我们就可以判断出来这个页面大概率是存在注入漏洞的。然后的话,布尔盲注一般需要结合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")
判断是否有引号
123\
- 如果页面显示正常,则说明这个值是数值类型,没有用引号
- 如果页面显示异常,则说明这个值是字符串类型,一定有引号
判断单双引号
123 ' 123"
- 123' 页面显示正常,但是123"显示异常,说明服务器端用的是双引号,反之就是单引号
延时注入格式:
id=1 and if(substring(database(),2,1)="b",sleep(11),"0")
注意:延时盲注返回结果不是布尔值
报错注入最大的危害
就是导致敏感信息泄露
报错原理:
就是我们可以让系统去发生报错,然后借助于mysql_error 输出报错信息,然后为了让它输出敏感信息,我们就在后面加上一个不存在的函数,然后它会提示你,这个库不存在这个函数,这个时候,我们就拿到了这个数据库名称了。
报错注入:
mysql_error()、mysqli_error()
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 转义后会被数据识别为~
标签:数据库,报错,error,类型,页面,盲注,注入 From: https://blog.csdn.net/ys1215/article/details/137482088