【问题标题】:Is it possible to do SQL injection (HIGH Level) on Damn Vulnerable Web App?是否可以在 Damn Vulnerable Web App 上进行 SQL 注入(高级)?
【发布时间】:2012-05-30 03:34:33
【问题描述】:

我搜索了整个谷歌,看看如何绕过以下内容(来自 DVWA 的高级安全性):

$id = $_GET['id']; 
    $id = stripslashes($id); 
    $id = mysql_real_escape_string($id); 

    if (is_numeric($id)){ 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

    $num = mysql_numrows($result); 

    $i=0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 

        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 

能破解吗?

对于那些不熟悉 DVWA 的人,这里有一个关于它的 youtube 视频: http://www.youtube.com/watch?v=oMV0JZVxvdQ

另外,我的另一个担忧是中等水平。它确实有 mysql_real_escape_string() 工作,但是当您从低级别使用相同的 SQL 注入并删除引号时,它会绕过保护。这是为什么?绕过mysql_real_escape string怎么这么容易?

Medium 级别的代码(简洁版)是这样的:

   $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 
    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";

我想使用 PDO,因为它可能更安全。请让我知道您对此的看法。

非常感谢。

【问题讨论】:

  • 嗨,我的问题是关于该死的易受攻击的 Web 应用程序,但如果需要,我只是添加了整个代码。谢谢
  • 你在说什么级别?它是 DVWA 特有的吗?
  • 是的,它是 DVWA 特有的。在 SQL 注入上练习有不同的安全级别(低、中、高)。低级别对 SQL 注入没有任何保护。中等级别只有mysql_real_escape_string 和高在我的帖子中。我也会把媒体的代码放上来。

标签: php mysql


【解决方案1】:

添加is_numeric 不会使这很可能成为全面的sql 攻击,但is_numeric 并不是很准确:

is_numeric('0xdeadbeef') // true
is_numeric('10e3') // true

使用过滤器可能会更好:

if (false !== ($id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT))) {
}

【讨论】:

  • 我更喜欢像$id = (int) $_GET['id'];一样投射它
  • @RomanNewaza imo 最好避免进行很可能不会产生任何结果的查询。
【解决方案2】:

我遇到了和你一样的问题。我也不知道怎么破解。

但我认为我对中等级别的问题有一个答案,我认为这是程序员的错误。

$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"

请注意,在低级别和高级别中,您在 $id 中都有引号,而不是在中...我认为这就是重点。 如果你有这个:

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"

我很确定在中级绕过 mysql_real_escape 字符串不会那么容易。

换句话说,我很确定,如果您没有在 High Level 中使用引号,您也可以进行注入。

【讨论】:

    【解决方案3】:

    在中等级别只需使用:1 and 1=1 order by X

    作者的所有查询都是低级的,但是您可以将表名替换为十六进制代码0x...,例如where table_name=0x12345。如果我们使用字符串 char 会出错,因为不允许使用 '

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 2022-06-13
      • 2020-03-25
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多