科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道SQL注入原理深度解析[2]

SQL注入原理深度解析[2]

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射、命令注射以及新近才出现的XPath注射等等。本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解。

来源:论坛整理 2008年9月18日

关键字: 入侵 攻击防范 SQL

  • 评论
  • 分享微博
  • 分享邮件
面是用来实现自动登录的Java代码,它从用户那里接收用户名和口令,然后通过一个SQL查询对用户进行认证:

Stringusername=req.getParameter("username");

Stringpassword=req.getParameter("password");

Stringquery="SELECTidFROMuser_tableWHERE"+

"username=’"+username+"’AND"+

"password=PASSWORD(’"+password+"’)";

ResultSetrs=stmt.executeQuery(query);

intid=-1;//-1impliesthattheuserisunauthenticated.

while(rs.next()){

id=rs.getInt("id");

}

  开头两行代码从HTTP请求中取得用户输入,然后在下一行开始构造一个SQL查询。执行查询,然后在while()循环中得到结果,如果一个用户名和口令对匹配,就会返回正确的ID。否则,id的值仍然为-1,这意味着用户没有通过认证。表面上看,如果用户名和口令对匹配,那么该用户通过认证;否则,该用户不会通过认证——但是,事实果真如此吗?非也!读者也许已经注意到了,这里并没有对SQL命令进行设防,所以攻击者完全能够在用户名或者口令字段中注入SQL语句,从而改变SQL查询。为此,我们仔细研究一下上面的SQL查询字符串:

Stringquery="SELECTidFROMuser_tableWHERE"+

"username=’"+username+"’AND"+

"password=PASSWORD(’"+password+"’)";

  上述代码认为字符串username和password都是数据,不过,攻击者却可以随心所欲地输入任何字符。如果一位攻击者输入的用户名为 ’OR1=1— 而口令为 x

那么查询字符串将变成下面的样子:

SELECTidFROMuser_tableWHEREusername=’’OR1=1--’ANDpassword

=PASSWORD(’x’)

  该双划符号--告诉SQL解析器,右边的东西全部是注释,所以不必理会。这样,查询字符串相当于:

SELECTidFROMuser_tableWHEREusername=’’OR1=1

  如今的SELECT语句跟以前的已经大相径庭了,因为现在只要用户名为长度为零的字符串’’或1=1这两个条件中一个为真,就返回用户标识符ID——我们知道,1=1是恒为真的。所以这个语句将返回user_table中的所有ID。在此种情况下,攻击者在username字段放入的是SQL指令’OR1=1--而非数据。

  四、构造SQL注射代码

  为了成功地注入SQL命令,攻击者必须将开发人员的现有SQL命令转换成一个合法的SQL语句,当然,要盲注是有些难度的,但一般都是这样:

'OR1=1–

或者

')OR1=1--

  此外,许多Web应用提供了带来错误报告和调试信息,例如,利用'OR1=1--对Web应用进行盲注时,经常看到如下所示的错误信息:

Errorexecutingquery:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'SELECT(title,body)FROMblog_tableWHEREcat='OR1=1'atline1

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章