sql注入攻击

目录

  • 最基础的注入 - union 注入攻击
  • Boolean 注入攻击 - 布尔盲注
  • 报错注入攻击
  • 时间注入攻击 - 时间盲注
  • 堆叠查询注入攻击
  • 二次注入攻击
  • 宽字节注入攻击
  • base64 注入攻击
  • cookie 注入攻击 - http 请求头参数注入
  • XFF 注入攻击 - http 请求头参数注入
  • 知道绝对路径的注入

0x01 最基础的注入 - union 注入攻击

  1. 判断是 get 型还是 post 型注入;

  2. 找到正确的闭合规则;

  3. order by 查询字段数;

  4. union select 1,2….. 查看显示位是第几位,没有的话就试试把 id=1 的显示位让出来,让其等于 id=-1;

    img

  5. 第二、三位显示出来了,那么即可在这两个位置写入 sql 语句;

  6. 查询当前数据库, 当前 mysql 用户 union select 1,user(),database();

  7. 查询当前数据库里面的表 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=”data_name”;

  8. 查询到敏感表名 user,继续查询表里面的字段 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=”user”;

  9. 查询字段,例如 “id”、”passwd” 的内容 union select 1,id,passwd from user;

  10. 拿到用户、密码登入后台。

0x02 Boolean 注入攻击 - 布尔盲注

  • 查看现象,能报错,但没有报错信息,正确查询也显示不了查询内容就属于布尔盲注,只存在两种状态,对或错;
  • 由页面的两种不同返回的状态来判定我们的闭合规则;
  • 为了方便,我们这里假设返回正确用 “yes”,返回错误用“no” 来表示这两种状态
  • 找到闭合规则后,我们在闭合规则里面 and 1=1 和 and 1=2 测试一下,看看最后返回是不是两种状态;
  • 布尔盲注要用到 length() 和 substr() 语句,用两种状态来猜解数据库、表名等的长度和正确字母;
  • 先用 and length(database())>2 来猜数据库的长度,使用的是二分法;
  • 再用 and substr(database(),1,1)=’t’ 来确定第一个字母,可用 burp 跑,26 个字母, 哪个字母返回 yes 则代表第一个字母就是它;
  • and substr(database(),2,1)=’t’ 代表当前数据库的第二个字母;
  • 最后结合长度,成功的将数据库猜解出来;
  • 后面的操作跟 union 注入的步骤差不多了,只是 sql 语句写在 上文的 database() 处。

0x03 报错注入攻击

  1. 只要注入点有 sql 报错信息,那么就可以使用报错注入;

  2. 还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的 sql 语句;

  3. updatexml 报错获取当前数据库:

    1
    and updatexml(1,concat(0x7e,(select database()),0x7e),1)
  4. floor 报错获取当前数据库:

    1
    and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
  5. 两种方式都可行,如果第一个不行就试试第二个

  6. 接着可以利用 select 语句替换掉上面 database() 来继续获取数据库中的表名、字段名,查询语句和 union 注入攻击的语句相同;

  7. 只不过这里不能再使用 group_concat 了,因为报错注入只显示一条结果,所以需要使用 limit 语句;

0x04 时间注入攻击 - 时间盲注

  • 没有明确的现象,不管是对是错都返回一个状态;

  • 但是如果用 sleep(5) 方法,能让响应时间延迟为 5 秒以上,那么就为时间盲注;

  • 我们用 sleep(5) 函数构造了一个时间延时的状态,因此,我们又有了两种状态,像布尔盲注一样可以根据这两种状态来判定数据库、表名和字段名的长度和正确的每个字母;

  • 同样的找到正确的闭合规则,当然,这个闭合规则得配合着 and sleep(5) 语句来构造,哪一个闭合规则执行了 sleep(5),那么就是正确得闭合规则;

  • 时间盲注配合着 if(A,B,C) 语句结合使用,含义是:如果 A 是 true,则返回 B(也就是执行 B),否则返回 C(执行 C);

  • 那么判断当前数据库名的长度的语句为:

    1
    if (length(database())>1,sleep(5),1)

    就是说如果数据库长度大于 1,那么响应延时 5 秒,否则执行 select 1(也就是不延时),由此来推出数据库长度。

  • 判断当前数据库名的第一个和第二个字母的语句:

    1
    if(substr(database(),1,1)='s',sleep(5),1)
    1
    if(substr(database(),2,1)='s',sleep(5),1)

    只有第一个字母等于 26 个字母中正确的字母时,才会延时 5 秒,因此可以通过 burp 或者 sqlmap 来跑。

  • 根据数据库名长度以此内推即可得出完整的数据库的库命、表名、字段名和具体内容。

0x05 堆叠查询注入攻击

  1. 可以使用堆叠注入的地方也可以使用布尔盲注与时间盲注;

  2. 同样先找出正确的闭合规则,然后也看两种状态来猜解库名、表名等;

  3. 类似与下面在分号后面可执行新的语句:

    1
    2
    ;select if(length(database())>1,sleep(3),1)
    ;select if(substr(database(),1,1)='r',sleep(3),1)
  4. 堆叠的; 分号后可以执行新的 sql 语句,因此在知道网站根目录的情况下可以直接写日志拿 shell。

0x06 二次注入攻击

  • 二次注入一共有两个 url,url 一用来注入,也就是注入点,插入 sql 语句的地方,另外一个 url 用来返回信息;
  • 也就是 url 一插入了 sql 语句,url 一的响应里面就会返回这条信息对应的 id 值,然后 url 二就传入这个新 id 值,然后访问,响应回来之后将会爆出 sql 语句查询的结果,正确或者错误的 sql 信息;
  • 就相当于 url 是一个用户注册的地方,用户注册后会在数据库里面加入新 id 存放用户的注册信息,那么这个 id 可以传给 url 二来访问,url 二就可以显示出用户的注册信息,但如果注册信息含义恶意 sql 语句,url 二就会显示出敏感的数据库信息;
  • 跟 union 注入攻击差不多,只是回显的信息需要在另外的 url 中显示出来了;
  • 后面就是 union 注入攻击的常规操作。

0x07 宽字节注入攻击

  1. 如果遇到单、双引号被转义,变成了反斜杠,导致参数 id 无法逃逸单引号的包围;
  2. 一般情况下,此处就不存在 sql 注入漏洞的;
  3. 但是如果数据库的编码为 GBK 时,就可以使用宽字节注入,因此在不知道是否是 GBK 编码时,都可以尝试去使用宽字节注入;
  4. 宽字节的格式是在地址后先加一个 %df ,再加单引号,因为反斜杠的编码为 %5c,在 GBK 编码中,%df%5c 是繁体字 “連”,因此,单引号成功逃逸,爆出 sql 错误;
  5. 因此构造闭合规则时,在单引号前面加上 %df 就行了;
  6. 之后在闭合规则中写入同 union 注入的一些查询语句就行了;

0x08 base64 注入攻击

  • 如果遇到 url 的参数 id 的值看起来像 base64 的,先拿去 url 解码,然后如果是 base64,拿去 base64 解码,解出来的应该就是 id 的值(1,2 等数字);
  • 那么如果要对这个 url 进行 sql 注入测试,就需要对 id 后面的所有值进行 base64 编码;
  • 注入的方式步骤都是跟 union 注入一样的,只不过后面的所有值(整个 payload)都要进行 base64 编码后传给 url 的 c 参数提交,包括闭合规则。

0x09 HTTP 请求头参数注入 - cookie 注入攻击

  1. 抓包对一个 url 的 http 请求头的所有参数进行 sql 注入测试,里面的所有参数都有可能存在注入点,如果响应包出现 sql 报错,那么测试的这个参数就是注入点;

  2. 常见的 http 头部注入的参数有:

    1
    【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】
  3. 如果测试到 cookie 参数的时候,响应有报 sql 错误,那么就是 cookie 注入攻击;

  4. 和 union 注入的差别就在于注入点不一样,之后使用 union 注入的方法即可。

0x10 HTTP 请求头参数注入 - XFF 注入攻击

  • XFF 注入即 HTTP 头部的 X-Forwarded-for 参数存在 sql 注入;
  • 例如测试此参数的值 X-Forwarded-for:127.0.0.1’ 响应有 sql 报错,那么此处就是注入点;
  • 之后使用 union 注入的方法完成即可。

0x11 知道绝对路径的注入

  1. 如果通过一些方式爆出了网站的根目录,并且知道此站点存在 sql 注入;
  2. 猜测此数据库可能有 file 权限,那么我们就可以使用语句:into outfile 来写 shell 到网站的根目录下,之后用菜刀连接;
  3. 如果数据库没有 file 权限,那么我们用 sqlmap 的参数 –is-dba 来查看当前数据库的用户是否有管理员权限;
  4. 如果有管理员权限,我们就可以使用 sqlmap 里面的参数命令 –os-shell 来上传、反弹 shell,最终 getshell;
  5. 如果 file、管理员权限都没有,那么另寻思路,日志、缓存写入等。
如果文章有帮到您,很开心得到您的支持!