2023-01-04 · 2분
渗透测试实践 — SQL 注入
SQLi 实践的 payload 速查表:基于错误、基于 UNION、盲注、基于时间的注入,外加 sqlmap、hashcat、SSRF 绕过和 Log4j JNDI 字符串的简要笔记。
2021-06-03 · 4분
这篇文章发布已超过两年,内容可能已过时。
SQL Injection 是指恶意用户利用安全漏洞,注入并执行任意 SQL 语句,操纵数据库做出异常行为的行为。
利用逻辑错误的 SQL Injection

上图所示的查询语句是登录时常用的 SQL 语句。当该语句对输入值没有验证时,就被恶意注入了任意 SQL 语句。用 ' or 1=1--,用一个闭合 WHERE 子句中单引号的单引号,加上 or 1=1 这个子句把 WHERE 子句全部变为真,再放入 -- 把后面的语句注释掉。
方法虽简单,但一旦成功,就会以最先创建的账户登录成功。由于最先创建的账户大多是管理员账户,所以能以管理员账户登录。

利用 Union 命令的 SQL Injection
指利用请求两个及以上查询以获取结果的 SQL 运算符 UNION 进行的 SQL 注入攻击;攻击者用此运算符在原请求中插入一条额外查询来获取信息。
用 UNION 运算符可以把两个及以上 SELECT 语句的结果合并成单一结果集。
但用 UNION 运算符合并的结果集必须都具有相同的结构。

上面所示的查询语句是从名为 Board 的表中检索帖子的查询语句。把输入值与 title 和 contents 列的数据比较后,输出有相似文字的帖子。这里若把输入值配合 Union 关键字放入 SELECT 语句,两条查询就会合并,看起来是一张表。若上述注入成功,由于是请求 id 和 password 的查询语句,用户的个人信息就会连同帖子一起显示在画面上。
Blind SQL Injection 用于无法从数据库获得特定值或数据、只能知道真假信息时。当登录表单可注入时,可通过服务器响应的登录成功、失败消息来提取 DB 的表信息。

上面的注入语句是查出数据库表名的方法。通过可注入的登录表单,恶意用户连同任意注册的 id abc123 一起,注入了 abc123' and ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1) 1,1)) > 100 -- 这条语句。
该语句是 MySQL 中查询表名的语句——用 limit 关键字只查一张表,用 SUBSTR 函数只取第一个字,最后用 ASCII 转换为 ASCII 码。
Time Based SQL Injection 同样是通过真假响应而非服务器的特定响应来泄露数据库信息的技法。

在 MySQL 中用 Sleep() 函数插入让查询结果在 5 秒后返回的攻击字符串时,若 5 秒后查询结果显示在画面上,就可判断存在漏洞。
存储过程是为运维便利而做的 SQL 集合形式,尤其是 MS SQL 中可用的 xp_cmdshell,注入了 Windows 命令 netstat -an。

在 GET、POST 请求字段、HTTP 头值、Cookie 值等中插入特殊字符(单引号(')或分号(;))时,若发生 SQL 错误,就可判断存在漏洞。
<table style="border-collapse: collapse; width: 100%; height: 120px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: center; height: 20px;"><b>字符串</b></td><td style="width: 50%; text-align: center; height: 20px;"><b>说明</b></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">'</td><td style="width: 50%; text-align: left; height: 20px;">字符数据分隔符</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">;</td><td style="width: 50%; text-align: left; height: 20px;">查询分隔符</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">--, #</td><td style="width: 50%; text-align: left; height: 20px;">该行注释分隔符<br><span style="color: #1b711d;">-- : Oracle, MSSQL</span><br><span style="color: #1b711d;"># MYSQL</span></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">/* /</td><td style="width: 50%; text-align: left; height: 20px;">/ 与 */ 之间的语句注释</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">||</td><td style="width: 50%; text-align: left; height: 20px;">字符连接 <span style="color: #1b711d;">(仅 Oracle)</span></td></tr></tbody></table>
参考:
https://noirstar.tistory.com/guestbook
https://kk-7790.tistory.com/74
https://m.blog.naver.com/koromoon/120172851234
https://tar-cvzf-studybackup-tar-gz.tistory.com/84
原文(韩语): tistory — 发布于 2021-06-03,已迁移至本博客。本翻译由 AI 协助完成。
…