2025 OWASP TOP1 | 破坏性注入(Injection Attacks)
## 漏洞描述
该攻击是一种常见的安全风险,也是初学者最先接触的安全风险之一。它是一种破坏性极强的攻击方式,一旦成功,可以实现数据篡改、窃取、破坏,甚至可以实现提权、控制整个系统。
- 什么是破坏性注入?
破坏性注入是: 攻击者通过应用程序的输入字段携带恶意代码,令应用程序在执行时出现意外行为,从而实现攻击目的。
注入漏洞常常存在于 ' 应用程序对用户提交的数据不验证、不清理、不过滤 ' 的情况。漏洞发生的核心原因为:应用程序将不可信的数据交给解释器。
## 常见注入攻击
- SQL注入
攻击原理:攻击者通过在输入字段中输入恶意SQL语句,当对输入内容验证和过滤不足时,恶意SQL语句将会执行,导致数据窃取、丢失等。
- 基础型SQL注入
最简单和直接将SQL语句嵌入输入中,拼接到查询逻辑中:
输入:name:admin' OR '1'='1;password:any
SELECT * from users where name='admin' OR '1'='1' AND password='any'
"非洲打法,没有欧美打法强力,没有亚洲打法复杂,但是真的简单啊"
- UNION联合注入
通过UNION联合查询语句,将非法的查询结果与合法的查询结果合并一同返回,从而获取敏感数据。
输入:' UNION SELECT * from users --
SELECT * from projects where id='' UNION SELECT * from users --'
"想要什么自己拿"
- 错误型SQL注入
该注入为故意触发数据库的错误,从返回信息中判断表名、列名、数据。
输入:' AND 1=CONVERT(int, (SELECT @@version)) --
SELECT * from projects where id='' AND 1=CONVERT(int, (SELECT @@version)) --'
可能的输出:Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2019 (RTM) - 15.0.2000.5' to data type int.从中,便可以看到SQL版本信息。
"并没有什么威胁性,如果攻防是文明6,那错误型SQL注入大概就是开局搓的侦察兵吧"
- 盲注
无法直接获取查询效果的时候,便可以尝试盲注了。盲注主要是布尔盲注,此外也存在通过时间延迟来逐步推测数据的盲注。
布尔盲注输入:' AND (SELECT 1 WHERE SUBSTRING((SELECT *database()),1,1)='t') --
SELECT * FROM users WHERE username = '' AND (SELECT 1 WHERE SUBSTRING((SELECT database()), 1, 1)='t') --'
示例注入效果:' SELECT database() ' 把数据库名取出,随后SUBSTRING部分取出第一个字符,随后判断一下这个是不是 t 。如果是 t 那么就会SELECT 1 WHERE 1。这样进行判断效率非常低,所以往往是先判断目标字段的长度,再使用BurpSuite进行Sniper攻击(逐个字符暴力猜测)。
延迟盲注输入:' AND IF(1=1, SLEEP(5), 0) --
SELECT * FROM users WHERE username = '' AND IF(1=1, SLEEP(5), 0) --'
延迟盲注可以在更极端的情况下进行,它甚至不需要返回与布尔相关的反应,只需要查看是否有延迟。
"WEB:只是在呼吸 盲注:数据GET数据GET数据GET数据GET数据GET"
- 堆叠查询注入
堆叠查询注入,其实堆叠的是语句而不是查询逻辑。核心是允许多条SQL语句同时执行。
输入:'; DROP TABLE users; --
SELECT * from users WHERE username=''; DROP TABLE users; --'
堆叠查询注入能够在原有的语句之外执行另外一个语句。但是有的插件就会避免两条语句堆叠执行,所以适用范围比较有限。但是真的强!
"绝活之所以惊艳是因为0人会用,堆叠查询注入也一样,有感觉吗"
- 存储过程注入
利用存储过程的输入参数注入恶意SQL。与上面的注入不同,存储过程注入不是利用MySQL语句,而是SQLserver语句。
输入:'; EXEC xp_cmdshell('dir'); --
EXEC LoginProcedure 'username', ''; EXEC xp_cmdshell('dir'); --'
EXEC原本的行为是:将用户输入内容,存入LoginProcedure的username。但是呢,EXEC有一个特性是,EXEC('sqlsqlsqlsql')可以把括号内的内容当SQL动态语句执行。示例便是通过xp_cmdshell执行系统命令dir来获得信息,也可以换成SQL语句执行。
"真的有人把业务逻辑放在数据库里吗?"
- Cookie注入
如题,利用Cookie注入
Cookie: session_id=' OR '1'='1;
在解析Cookie时就会进行注入。
- 更多更深入的注入
LDAP注入、XPath注入、OS命令注入、XML解析器注入、SMTP头部注入、表达式语言注入、ORM注入、OGNL注入
这些输入需要一些SQL基础之外的知识,我还不会,改天再补出来吧。这些属于DLC内容。
