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全称为可扩展标记语言,是一种有格式的文本数据
04.01.pngXML主要结构:
-
XML声明
-
XML文档定义类型
a. XML约束
b. XML实体
在XML解析器解析XML过程中会将实体应用替换为定义的实体字符串
分类:
-
内部实体
-
外部实体
-
参数化实体
c. XML文档
-
XXE
介绍
XXE全称XML外部实体注入,当XML解析器在解析引用外部实体时,可能导致数据泄露、拒绝服务、SSRF、端口扫描、远程代码执行等影响
攻击方式
-
获取服务器目录或文件
04.02.png 04.03.png -
拒绝服务攻击
04.04.png -
盲注
在数据无回显时可以使用盲注方式将数据发送到远程攻击服务器
04.05.png 04.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.png 04.10.png -
SQL Injection(advanced) 05
04.11.png 04.12.png 04.13.png 04.14.png 04.15.png 04.16.png 04.17.png 04.18.png 04.19.png 04.20.png 04.21.png 04.22.png 04.23.png 04.24.png 04.25.png 04.26.png 04.27.png 04.28.png -
SQL Injection(mitigation) 08
04.29.png 04.30.png 04.31.png 04.32.png 04.33.png 04.34.png 04.35.png 04.36.png 04.37.png 04.38.png 04.39.png 04.40.png 04.41.png 04.42.png -
XXE 03
04.43.png 04.44.png 04.45.png 04.46.png 04.47.png -
XXE 04
04.48.png 04.49.png 04.50.png 04.51.png 04.52.png -
XXE 07
04.53.png 04.54.png 04.55.png 04.56.png 04.57.png 04.58.png参数化实体执行顺序: %remote, %secret, %all, &ping
网友评论