网站已被SQL注入攻击

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)

分解:

  1. =-999.9只是结束您当前的查询
  2. 0x31303235343830303536NULL- 它们只是匹配现有查询中的列数.如果你有SELECT * FROM usersusers有4列,则UNION还必须有4列.结果,他们只使用`NULL值来填充这些列.
  3. 真正的困惑在于CONCAT().它们将126,39,数据库名称组合为十六进制值,39和126
  4. -- 是一个mysql注释 - 之后忽略了其余的查询

从这次攻击判断,我怀疑你没有输入输入mysql_real_escape_string(),这允许攻击跳出你的查询并执行他们自己的.

有关更多信息,请参阅owasp.org.

  • 有点像死神,但我想我不妨告诉你,0x31303235343830303536是自动SQL注入工具Havij的电话卡. (5认同)

Sar*_*fan 5

这不是完整的查询,实际上是在您的网络应用中输入此字符串的人.

现在,首先用联合部分中的空格替换%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)包围


bak*_*aro 0

首先,查询看起来像是 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 站点也有大量用于防御性编码的资源:

www.owasp.org