SQL注入在实战中与CTF中的总结
SQL注入不管在实战中还是CTF的试题中,都很常见,大部分的我都是SQLMAP一把搜,因为这样很便捷,但是一开始手工构造SQL语句进行bypass绕过WAF就很烦恼,遇到二次注入,堆叠注入,延迟注入,就开始各种找工具来达到我的目的,但是还是想,补充下这个方面的基础。
SQL注入的原理如图所示

而常见SQL注入的分类如下;

(来源于CTF特训营)
常见的显错注入;
列如;union 联合查询,如果代码层次上对参数并没有过滤的话。那么我们使用payload;"?id=-1‘+union+select+1+--+ 其中用“+ ”号替换空格,达到联合查询进行回显注入的效果,此时服务器处理的语句如下;
SELECT ID FROM users WHERE user_id=‘-1’ union select 1 --
三种报错注入(MySql)
涉及到三种方法
UPDATEXML 函数
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
数据库运行如下
SELECT updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23;

SELECT updatexml(1,concat(0x7e,(SELECT version()),0x7e),1);
在游览器里使用的payload 里的0x7e是”~”的十六进制编码,”#”用于注释站点自带的后面的SQL语句
这里方便看就直接打了
返回

floor 函数
floor函数返回小于等于该值的最大整数.
示意图如下
floor(1.21),floor(-21,22)

floor(1.21)取值1

其中floor原理是rand和order by 或者group by的冲突
floor注入,一个经典的语句;
select count(*),(floor(rand(0)*2))x from information_schema.tables group by x;
服务器返回了

这里我的理解是floor与group by起了冲突
select count(*) ,concat(user(),floor(rand(0)*2))x from mysql.user group by x

exp注入
exp函数报错,报错的本质是溢出报错,过大数值的查询导致溢出报错

我们通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。
对于报错注入的函数,我做了一个表,如下


浙公网安备 33010602011771号