[CTF技术]SQL注入攻击
SQL 注入原理,两个人在通讯的时候,对方把一段信息当作了可执行代码并且执行
SQL 基础语法
MySQL Crash Course
关系型数据库的 DBMS 系统
准备:下载
1 | USE myDB; |
操作
插入
1 | INSERT INTO myDB.myRecord (Idx, Name, Arrive) |
INSERT INTO
插入 数据库名.表格名
(列名1, 列名2, 列名3)
VALUE(数值)
更改/删除
添加一列
1 | ALTER TABLE myDB.myRecord |
更新一个
1 | UPDATE myDB.myRecord |
删除一个
1 | DELETE FROM myDB.myRecord |
删除表格/数据库
1 | DROP TABLE myDB.myRecord; |
查看
1 | USE myBD; |
合并
1 | SELECT * |
链接
1 | SELECT * |
其他函数
1 | SELECT SLEEP(2) |
注释
1 | /* |
常用编码
Space: %20
#: %23
': %27
": %22
+: %2B
正题:SQL 注入攻击
可见:恶意使用 SQL 增删改查四种操作都是违法犯罪行为!
SQL 注入原理,两个人在通讯的时候,对方把一段信息当作了可执行代码并且执行
信息收集->功能分析->利用逻辑->绕过(知识储备)+ 耐心
最简单:有回显的 SQL 注入
SQL 注入类型的判断:数字型/字符型
让引号为奇数个,导致字符型查询报错 或者通过传入一个算式,这样数字型可以正常查询但是字符型查询不到任何内容获取更多信息(有回显的情况下)
通过联合查询
1 | SELECT ... UNION SELECT ... |
获取列数
前提是有报错信息,当 M 大于实际的列数的时候无法`ORDER BY`于是会报错 后者用 `UNION SELECT 1, 2, 3`来让各列嵌入 1, 2, 3...获取所有数据库名+表名(仅限 MySQL)
例
无回显的 SQL 注入(只有 Found 和 Not Found 1bit 信息)
判断查找语句
判断是单引号还是双引号进一步利用 1bit 的信息
利用 SQL 的注释符号,把后面的单/双引号注释掉。同时注入自己的条件代码
无回显的 SQL(甚至不会显示 error) 利用延时注入
OR 的话从左到右寻找真值,所以用 OR 的话每次找用户 admin 找不到以后都会延时一次,导致延时时间过长,注入效率降低会回显报错信息->报错注入
堆叠注入
很多数据库支支持多个 SQL 指令在一行中执行。但是服务端的语言不会支持获取多行的结果
1 | SELECT 1; SELECT 2; |
二次注入
在第二次没有进行过滤而是直接拼接SQL 注入的绕过
常见防护方法/检测方法
- 直接拦截
- 关键字替换
- 编码转移 基本无解
- 参数化查询 不会把输入直接拼接到 SQL 中 基本无解
检测方式 - 关键字匹配(直接查找/正则)
- 语义匹配(例如一个引号就加一个反斜杠转义,一对引号就不转义)
注入绕过
总结
以上的例子:- Module1:PHP
- Moudel2:mySQL
双方互相理解出现了偏差
其他类型的注入同理
实现了任意文件读取
假如某个网页能实现预览其他网页的功能,直接把目标网页拼接到后面
拼接一个10.0.0.0
等等内网的地址,于是你能看到原本不能看到的内网信息
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.