SQL
SQL全称为结构化查询语言,用于操作数据库,由数据库进行解析和执行,主要分为DDL(数据定义语言),DML(数据操作语言)和DCL(数据控制语言)
DDL:create,alter,drop,truncate
DML:select,insert,update,delete
DCL: grant,revoke
SQL注入
介绍
SQl注入攻击通过攻击者提交包含恶意代码的数据到应用程序,应用程序将提交恶意数据当作SQL交给数据库服务进行执行,从而导致攻击者控制数据库服务执行
利用方式
从数据库中读取或修改敏感数据
对数据库执行管理操作,例如关闭审计和数据库,截断表或日志,添加用户
从数据库文件系统中获取的存在的文件内容
执行操作系统命令
危害
身份欺骗
篡改现有数据
抵赖,例如取消交易或修改交易金额
获取服务器上所有的数据信息
销毁数据或者导致数据不可用
严重性
取决于攻击者的技能和想象力,应用程序对输入的检查,数据库的执行权限
以及使用的数据库技术
原理
- 用户登录流程SQL:
$sql = 'SELECT * FROM user WHERE name="' + $_POST['name'] + '" AND
password="' + $_POST['password'] + '"';
- 用户获取/查询流程SQL:
$sql = 'SELECT * FROM user WHERE id=' + $_POST['id'];
$sql = 'SELECT * FROM user WHERE desc="' + $_POST['desc'] + '"';
攻击者可通过控制提交的数据name, password, id控制SQL的执行流程,例如一下payload:
-
name:
" or 1=1 #
$sql = 'SELECT * FROM user WHERE name="" or 1=1 #" AND password=""';
解释:
#
为MySQL注释符,最终执行SQL为:$sql = 'SELECT * FROM user WHERE name="" or 1=1';
执行语义: 查询所有用户信息(逻辑or 1=1为逻辑or True)
-
id:
1 or 1=1
$sql = 'SELECT * FROM user WHERE id=1 or 1=1';
执行语义: 查询所有用户信息(逻辑or 1=1为逻辑or True)
-
desc:
" or "1"="1
$sql = 'SELECT * FROM user WHERE desc="" or "1"="1"';
执行语义: 查询所有用户信息(逻辑or "1"="1"为逻辑or True)
-
name, desc:
";drop table user; #;
$sql = 'SELECT * FROM user WHERE name="";drop table user; #" AND password=""'
;$sql = 'SELECT * FROM user WHERE desc="";drop table user #"';
解释:
#
为MySQL注释符,最终执行SQL为:$sql = 'SELECT * FROM user WHERE name="";drop table user;';
$sql = 'SELECT * FROM user WHERE desc="";drop table user';
执行语义: 查下用户信息后删除掉表user
分类
-
整数型注入
拼接在SQL中的数据为整数类型,并可用于SQL注入
-
字符串型注入
拼接在SQL中的数据为字符串类型,并可用于SQL注入
-
特殊字符注入
拼接在SQL中的数据允许通过注释符(
/**/, -- , #
),SQL分隔符(;),运算符(+,||
),数据库函数(char),并可用于SQL注入 -
盲注
某些情况下不能直接错误回显和输出结果来判断是否存在注入,需要通过执行的结果的真假以及回显逻辑,或通过提交休眠SQL以及响应时间差异来判断是否存在注入
- 基于内容的盲注:
针对数据存在的请求,整数(字符串)类型分别拼接
AND 1=1
和AND 1=2
(' AND '1'='1
和' AND '1' = '2
)的请求结果来观察是否存在SQL注入,若AND 1=1
(' AND '1'='1
)与未拼接时一致,但AND 1=2
(' AND '1'='2
)无结果,可判断存在SQL注入针对数据不存在的请求,可通过拼接逻辑OR并观察请求结果来判断是否存在SQL注入
OR 1=2
(' OR '1'='2
)与未拼接时一致,但OR 1=1
(' OR '1'='1
)有结果)利用方式:通过拼接
AND substring(@@version,1,1) = '8'
(OR substring(@@version, 1, 1)='8'
)的逻辑返回结果来判断数据库主版本是否正确,类似可通过暴力破解来获取数据内容- 基于时间的盲注:
通过拼接
sleep(n); --
等休眠语句,通过响应时间是否存在差异来判断是否存在SQL注入 -
order by
针对SQL查询语句中若使用order by可使用case when then end语句进行盲注
防御
使用静态SQL语句
使用参数化查询SQL(预处理方式)
使用安全的存储过程(在存储过程中禁止拼写SQL字符串进行执行)
-
数据参数检查
数据是否为空
数据格式(类型格式和正则格式)
数据范围(大小,长度,可选值)
XML
Xml全称为可扩展标记语言,是一种有格式的文本数据
XML主要结构:
XML声明
-
XML文档定义类型
a. XML约束
b. XML实体
在XML解析器解析XML过程中会将实体应用替换为定义的实体字符串
分类:
内部实体
外部实体
参数化实体
c. XML文档
XXE
介绍
XXE全称XML外部实体注入,当XML解析器在解析引用外部实体时,可能导致数据泄露、拒绝服务、SSRF、端口扫描、远程代码执行等影响
攻击方式
-
获取服务器目录或文件
04.02.png04.03.png -
拒绝服务攻击
04.04.png -
盲注
在数据无回显时可以使用盲注方式将数据发送到远程攻击服务器
04.05.png04.06.png
防御
设置XML解析器禁用DTD
设置XML解析器禁用外部实体
不依赖与框架,对http头中content-type及accept进行验证
过滤提交数据中的
<!DOCTPE
和<!ENTITY
解题
-
SQL Injection 07
04.07.png -
SQL Injection 08
04.08.png -
SQL Injection(advanced) 03
04.09.png04.10.png -
SQL Injection(advanced) 05
04.11.png04.12.png04.13.png04.14.png04.15.png04.16.png04.17.png04.18.png04.19.png04.20.png04.21.png04.22.png04.23.png04.24.png04.25.png04.26.png04.27.png04.28.png -
SQL Injection(mitigation) 08
04.29.png04.30.png04.31.png04.32.png04.33.png04.34.png04.35.png04.36.png04.37.png04.38.png04.39.png04.40.png04.41.png04.42.png -
XXE 03
04.43.png04.44.png04.45.png04.46.png04.47.png -
XXE 04
04.48.png04.49.png04.50.png04.51.png04.52.png -
XXE 07
04.53.png04.54.png04.55.png04.56.png04.57.png04.58.png参数化实体执行顺序: %remote, %secret, %all, &ping