[SUCTF 2019]EasySQL 1-【SQL注入】

说白了,[SUCTF2 01 9 ]EasySQL1 的SQL注入挑战其实很简单,就是通过注入技术获取flag信息。
这道题的复杂之处在于,它不仅考验对SQL注入的理解,还涉及到一些高级技术的应用。

我们先来说说最重要的事情。
起初我以为这是一个简单的常见问题,但后来我发现这是错误的。
后台代码过滤了关键词。
我们去年跑的项目大概有3 000关,也遇到了类似的情况。
通过输入数字,观察回显,原来系统后台代码是:select$_POST['query']||flagfromflag。
在此基础上,尝试在'之前直接串联,解析flag的内容。

还有一点,还有一个必不可少的细节,就是栈注入的应用。
在 || 的帮助下Mysql 中的运算符,设置 sql_mode=PIPES_AS_CONCAT, ||被认为是字符串连接运算符,以实现多条SQL语句的批量执行。
去年我们测试一个电子商务系统时,我们就使用了这种方法来绕过复杂的过滤机制。

等等,还有一件事,使用Burpsuite进行字典注入也是一个不错的选择。
当你看到字符过滤时,实际上很混乱。
这时候就可以使用Burpsuite来加速批量测试。
具体操作是查看源码确认注入点,打开代理,插入测试值,通过代理抓包,使用Burpsuite的Intruder工具进行集群测试。

我认为这个方法值得一试,特别是在处理复杂的过滤和字符过滤机制时。
等等,我好像走了,应该很快就会回来。
简而言之,对于 [SUCTF2 01 9 ]EasySQL1 挑战,您可以尝试使用堆栈注入和解决方案一来获取标志。

SQL注入的问题

上周我看到一篇关于注射的文章。

原理是链环问题。

第一种写法:
cmd="SELECTFROM[Table]WHEREID="+ID
ID 必须是数字。
但如果标识符是字符串,例如“1 0”,那就没问题。

但是如果ID是“0ORTRUE”,则表示有错误。

此时,SQL语句就变得恶意了。

为避免这种情况,需要进行身份验证。
看看它是否是一个数字。

第二种写法:
cmd="SELECTFROM[Table]WHEREName='"+Name+"'
名称必须是字符串。
但是如果名称中有单引号,比如'Name',那就没问题。

但是如果名称是'Name'或者''=',就会出事。

这时候SQL语句就变成恶意的了。

为了避免这种情况,请检查是否包含单引号。

测试方法很简单。

至于工具,就看有没有这个功能了。