SQL注入
1. 联合注入
原理:在一个网站的正常页面,服务端执行sql语句查询数据库中的数据,客户端将数据展示在页面中,这个展示位就叫显示位。
注入过程:
1)判断闭合方式,闭合sql语句 ’ ') ')) " ") "))
2)order by 查询列数
3)union select查询输出位置
4)查询数据库名、表名、列名、数据等
2. 盲注
盲注是指在测试数据库时,没有任何回显,只显示对错。一般采用逐字爆破的形式将所需数据爆破出来。
-
布尔盲注
服务端只会根据你的注入语句返回Ture和Fales,根据返回页面的正常与否、内容差异判断是否查询成功。
函数:
length():判断字符串长度
substr():要截取的字符串从哪位开始截取几个
ascii():返回字符串的ASCII码 -
时间盲注
页面返回值只有ture,通过返回时长的差异判断是否查询成功。
函数:
sleep():延迟函数
if():若条件为真,执行TRUE,假执行FALSE
substring()
get_lock():为名称为name的锁进行加锁,监听状态,一旦time这个时间内其他连接释放了“name“”锁,那么会对“name”加锁成功。返回0表示不是空锁,已经被占用。主要防止并发代码,确保当前总是只有一个事件在执行。
3. 报错注入
原理:人为的制造报错,后台没有屏蔽报错信息,直接回显在前端,从而可以从报错信息中获取设定的信息。
函数:
updatexml():是MySQL对xml文档数据进行查询和修改的xpath函数
extractvalue():是MySQL对xml文档进行查询的xpath函数
floor():MySQL中用来取整的函数
exp():此函数返回c指数x的幂数
4. 二次注入
原理:已经存储()数据库、文件)的用户输入被读取后再次进到SQL查询语句中导致的注入。服务器会先转义,直接注入不成功。
5. 堆叠注入
利用分号;同时执行多条语句
利用条件:php中使用mysqli_multi_query函数,但一般情况下会使用mysqli_query()函数,一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数。
6. 宽字节注入
原理:在数据库使用了宽字节集而web中没考虑这个问题,在web层,由于0xBF27是两个字符,在php中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27编程0xbf5c27,而数据进入数据库中时,由于0xbf5c是另外一个字符,因此,转义符号会被前面的bf吃掉,单引号由此可以逃逸出来闭合语句。
**根本原因:**客户端的字符集与连接层的字符集不同,或转换函数如,iconv、mb_convert_encoding使用不当。