sur*_*ram 33 mysql sql-injection
最近我的网站被SQL注入攻击.黑客使用以下查询来获取我的数据库名称.我无法理解他们写的这个查询.
查询:
=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
Run Code Online (Sandbox Code Playgroud)
查询运行后显示整数结果,如" 74545883".
你能解释一下查询是如何工作的吗?
set*_*rgo 19
它看起来像是一次溢出攻击.他们UNION使用您现有的查询.替换所有你%20的(空格),因为它的url编码产量:
=-999.9 UNION ALL SELECT CONCAT(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536-
Run Code Online (Sandbox Code Playgroud)
分解:
=-999.9只是结束您当前的查询0x31303235343830303536是NULL- 它们只是匹配现有查询中的列数.如果你有SELECT * FROM users和users有4列,则UNION还必须有4列.结果,他们只使用`NULL值来填充这些列.CONCAT().它们将126,39,数据库名称组合为十六进制值,39和126-- 是一个mysql注释 - 之后忽略了其余的查询从这次攻击判断,我怀疑你没有输入输入mysql_real_escape_string(),这允许攻击跳出你的查询并执行他们自己的.
有关更多信息,请参阅owasp.org.
这不是完整的查询,实际上是在您的网络应用中输入此字符串的人.
现在,首先用联合部分中的空格替换%20,得到:
SELECT concat(0x7e,0x27,Hex(cast(database() as char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
Run Code Online (Sandbox Code Playgroud)
好像用户将字符串放在您期望编号的某个位置.所以,你看到首先有一个数字(999.9)来完成查询的原始条件.然后,添加UNION部件.最后,在UNION部分之后,添加注释字符( - ),以便绕过查询的其余部分(可能由您的系统添加).
我们可以格式化代码以便更好地理解:
SELECT
concat
(
0x7e,
0x27,
Hex(cast(database() as char)),
0x27,
0x7e
),
0x31303235343830303536,
0x31303235343830303536,
0x31303235343830303536
Run Code Online (Sandbox Code Playgroud)
现在,结果第一列的子字符串将包含数据库名称的十六进制编码形式.实际上,它应该被单引号(0x27)包围,然后再次被〜(0x7e)包围
首先,查询看起来像是 HTML 编码的。将 s替换%20为空格,它会变得更具可读性。他们还将部分查询转换为某种内容的十六进制表示形式。也尝试对语句的该部分进行十六进制解码。
当您尝试将 SQL 动态创建为字符串,然后将其发送到 DBMS 时,就会产生 SQL 注入风险。想象一下像这样的字符串存储在您的系统中用于搜索栏等:
SELECT * FROM SOME_TABLE WHERE SOME_COLUMN=
为了完成查询并让攻击进入,他们需要这样输入:
'x' or 1=1
在这种情况下,查询将变为:
SELECT * FROM SOME_TABLE WHERE SOME_COLUMN='x' or 1=1
SOME_COLUMN可以是任何变量,在哪里失败并不重要,重要的是它1=1始终为真,从而可能使攻击者能够访问该表中的每一行。
现在您已经了解了,请检查您的代码并将每个动态创建的查询替换为准备好的语句。OWASP 站点也有大量用于防御性编码的资源:
| 归档时间: |
|
| 查看次数: |
34629 次 |
| 最近记录: |