二次sql注入


f6J,K{F4E0m0这种注入方式一般是在如下情况出现时发生:为了预防SQL注入攻击,而将输入到应用程序中的某些数据进行了“转义(escape)”,但是这些数据却又在“未被转义(Unescaped)”的查询窗体中重复使用。 PHPChina 开源社区门户 L?7nB8U M0| N
例如,这里我们更改登录处理页面(在前面“攻击系统”一节中介绍的那个页面)以回避单引号:
7D.o A+e"_ C3n]9J0 PHPChina 开源社区门户-h @!R6e3G }

username = escape( Request.form("username") );
H!Kox J gO{0password = escape( Request.form("password") );PHPChina 开源社区门户_T8@ }3v6{,g9~�|
var rso = Server.CreateObject("ADODB.Recordset");
bm T&^�N8w.C,}0var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
/[ fYU L)I0rso.open( sql, cn );


"o*p#j:d2/2/9K,t0这个转义(escape)函数如下所示: PHPChina 开源社区门户1omdD`T@Y1g�l
PHPChina 开源社区门户&{ a]K*tz0n

function escape(str)
oQIq&g HT6S4Zz0{PHPChina 开源社区门户&t)r/Pr E uCS e
  var s = new string(str);
skKq/#^&@n0  var ret;
QTK9tw8E0  var re = new RegExp("'","g");PHPChina 开源社区门户E-E$?M._y4W(}b
  ret = s.replace(re,"''");PHPChina 开源社区门户%Kz+c6o'W
  return ret;PHPChina 开源社区门户?o.V5AL g
}


/BGc&B w;O h0请留意Jscrīpt的“String”对象在实现“replace”方法时存在一个弱点是非常重要的--下面的代码仅仅替换单引号的第一个字符:
~$]i~[;{1SI0 PHPChina 开源社区门户!B(U b??H

function badescape(str)PHPChina 开源社区门户�ycC.B(Hn6lj*f-}
{PHPChina 开源社区门户U(AN5L/s3Q7~H
  var s = new string(str);
2a$x6E&`9QI0  var ret;PHPChina 开源社区门户)L1U4z/dQ
  ret = s.replace("'","''");PHPChina 开源社区门户8m![~6n"G1b/a Z
  return ret;PHPChina 开源社区门户} _6s6T9w [vpCh
}

PHPChina 开源社区门户!bv2k'N*`8g4@sm)j
为了能够成功地进行二次SQL注入,现在的攻击者可能不会再使用我们这里用作示例的任何方法进行SQL注入。 PHPChina 开源社区门户,~%yVwd8J
但是,假设应用程序允许用户可以更改他们的口令,实现这种功能的代码大致如下所示: PHPChina 开源社区门户+xp!M F uL2l(v

3GM%R#|8j0G8sP ej.P0

username = escape(Request.form("username"));PHPChina 开源社区门户I0a2hb [7NG
oldpassword = escape(Request.form("oldpassword"));PHPChina 开源社区门户 }&WnJcz pN./,x+{
newpassword = escape(Request.form("newpassword"));
7n-_L?4KaR5|0var rso = Server.CreateObject("ADODB.Recordset");PHPChina 开源社区门户m$l?TLk
var sql = "select * from users where username='" + username + "' and  password = '" + oldpassword + "'";PHPChina 开源社区门户ZE+]1k0d1@*SO$M
rso.open(sql, cn);
,/+]:g;rw f l(FF0if (rso.EOF)
-D"Kb.h5|$l h?c:K0{PHPChina 开源社区门户L,c;s2QP8@
...

PHPChina 开源社区门户6kZL/c&S O
设置新密码的查询与如下代码可能有些相似: PHPChina 开源社区门户Sp;R /8d

:~6pWF-[-u0

sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'";

PHPChina 开源社区门户6f;w2L8?(v$M8{
在该示例代码中,rso("username")是从“login”查询中检索到的用户名称。假定用户名称为admin'--,该查询语句实际上就是下面的查询: PHPChina 开源社区门户%Y"oF6N$bC,d w[t

#b RveA/@M7d0

update users set password = 'password' where username = 'admin'--'

PHPChina 开源社区门户/nHw:a"`!J`c
因此,攻击者可以通过用户名admin'--进行注册的方法,随意设置系统管理员admin的密码。 PHPChina 开源社区门户"wa!T{'@+u W^rD

k/sD-e[H,q0这主要强调了自始至终都要坚持输入验证的重要性,哪怕是对系统已经使用过的数据,在查询中包含该数据以前,也要坚持对其进行输入验证。
o0Q^%N^OP@"M0
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值