1

当出现以下漏洞时,我正在扫描一个站点:CGI Generic SQL Injection

nessus 表示,攻击者可能利用此漏洞绕过身份验证、读取机密数据、修改远程数据库,甚至控制远程操作系统。

所以我继续阅读并发现漏洞位于这段代码中:

使用 POST HTTP 方法,Nessus 发现:

  • 以下资源可能容易​​受到 SQL 注入的影响:

  • /LoginTeacherForm.aspx CGI 的“_codeTextBox”参数:

    /LoginTeacherForm.aspx [ loginButton=Login& _VIEWSTATE=dDwtMTU2NDIxMDkwN Ts7Pg%3d%3d&btnChangePassword=Wijzig%20Pincode&_pinCodeTextBox=&_codeTex tBox='+convert(int,convert(varchar,0x7b5d))+']

- - - - 输出 - - - -

 Exception Details: System.Data.SqlClient.SqlException: String or
binary data would be truncated.
The statement has been terminated. 

但我想知道攻击者如何利用这个漏洞,因为当我粘贴那段代码时,它只会给我错误。

所以我的问题是攻击如何能够真正侵入网站并绕过登录等。(当然只是教育目的)

4

2 回答 2

1

它看起来像是由 Nessus 请求引起的误报,导致您的页面在字段中插入了太长的字符串。Nessus 检测到该错误是一个 SQL 服务器错误,并表示它可能是一个 SQL 注入漏洞。

要测试自己,请尝试_codeTextBox=设置为单引号的请求,看看您是否仍然获得SqlException. 如果是这样,请将其修改为两个单引号,并且如果错误消失,则您可​​能很容易受到攻击。

于 2013-08-27T11:32:35.740 回答
0

该错误System.Data.SqlClient.SqlException表示您的 SQL 查询语句中存在错误。这意味着存储在_codeTextBox参数中的值在被放入查询之前 没有经过验证或以其他方式进行清理。

根据查询和围绕其返回值的逻辑,这将产生不同的影响。如果不彻底了解 Web 应用程序,就不可能确定最坏的情况。可以这么说,这个问题应该由开发人员解决。幸运的是,一旦确定,通常很容易修复。

在这种情况下,看起来_codeTextBox参数正在传递给convert函数。我怀疑任何人都可以利用这一点。但是,这表明不安全的编码实践可能出现在 Nessus 不知道的其他领域。阅读下文了解更多信息。

当程序员简单地将值与 SQL 查询字符串连接时,我最常看到这种情况:

不安全示例(java)(来源OWASP

String query = "SELECT account_balance FROM user_data WHERE user_name = "
  + request.getParameter("customerName");

try {
    Statement statement = connection.createStatement( … );
    ResultSet results = statement.executeQuery( query );
}

由于该值只是附加到查询的末尾,因此用户可以更改查询以执行一些邪恶的操作,例如以任何用户身份登录或查看所有事务。在上面的示例中,用户可以将customer name参数更改为类似'' or 1=1或更糟的值。

预期查询:

 SELECT account_balance FROM user_data WHERE user_name = someuser

错误查询:

 SELECT account_balance FROM user_data WHERE user_name = '' OR 1=1

OWASP推荐以下防御措施。您的情况将决定什么是合适的:

主要防御

  1. 使用准备好的语句(参数化查询)
  2. 存储过程的使用
  3. 转义所有用户提供的输入

附加防御

  • 同时执行:最小特权
  • 同时执行:白名单输入验证

您确实需要查看OWASP的站点并阅读有关SQL 注入的更多信息。

于 2013-09-09T16:18:41.923 回答