CISP PTE的INSERT型SQL注入article1题解
在CISP PTE考试中有一道INSERT型SQL注入题目,考试过程中我找到注入点、也获取了部分数据,但是最终未能成功拿到key。
这篇文章将对题目环境进分析复现,并进行拓展思考。
环境复现
使用关键词cisp "insert article1"可以找到题目的题解,使用AI模型可以快速根据题解生成题目环境:
请根据这篇writeup文章 https://www.cnblogs.com/Summer-123/p/16925457.html |
在大模型输出的基础上进行调整,即可得到可用的源代码。
解法分析
题目环境是一个博客发表系统,提供如下功能:
- 用户注册、登录;
- 发表博客;
- 查看博客。
发表博客位置存在SQL注入漏洞点,程序将博客标题和博客内容两个字段拼接进SQL语句。
程序虽然对SQL注入里常用的注释符(--,#)进行了过滤,但可以被绕过。
解法1:绕过过滤
在下面过滤代码中先后对两种注释符进行了过滤,而且后处理的过滤符可以包含在前一种过滤符中。因此如果用户输入的字符为-#-时,前面的过滤对用户输入不起作用,而后一种则帮助攻击者去除掉了干扰字符、达到了注释后续语句的目的。
//代码过滤规则 |
解法2:补全语句
按照MySQL的手册[1],INSERT ... VALUES语句可以使用英文逗号隔开多行数据,一次性插入数据库。
根据题目给出的表结构提示,通过如下方式可以补全SQL语句,完成注入:
博客标题: title1 |
解法3:多行注释+特殊用户名
解法参考这篇博文[2],由于系统在注册用户处未对用户名的特殊字符进行过滤,因此可以注册恶意的用户名对SQL语句进行补全。
按照下面内容注册用户、发表博客文章之后,SQL注入回显会在user1用户的博文列表里显示。
注册用户: */,'user1 |
这种解法的关键在于多行注释/* ... */,特殊用户名用来闭合多行注释。
后续思考
注意点
- 按照一般业务逻辑,因为博客正文内容长度要超过博客标题,所以应该优先考虑在博客正文处回显。
PostgreSQL、SQLite数据库
因为PostgreSQL和SQLite数据库默认支持使用||对字符串进行拼接(MySQL需要单独设置SQL模式[3]),所以这两种数据库的INSERT型注入攻击实现要比MySQL容易些。
可以直接使用 ' || (SELECT key from key || '将flag信息拼接在输出中。
insert with select
sqlmap
对于手工测试已知存在漏洞的SQL注入点,可以借助sqlmap工具进行自动化测试。
合法授权情况下,怎样使用SQLmap对存在INSERT型注入的PHP应用、MariaDB数据库进行渗透测试? |
SQL注入辅助理解工具
人工想象注入时恶意输入对SQL语句语义的修改不直观,可以借助AI编写小工具。
请用纯js编写一个SQL注入辅助理解网页工具: |
对大语言模型的网页输出进行简单测试:
| LLM | ChatGPT | Gemini | Grok |
|---|---|---|---|
| a变量重定义b内容不清空 | OK | OK | OK |
| 内容替换正常 | OK | OK | ~OK |
| 注释正确显示 | NOK | OK | OK |
| 引号与注释正常处理 | NOK | NOK | OK |
| 网页设计 | NOK | OK | ~OK |