首页 > 其他 > 详细

二次注入

时间:2019-03-25 17:41:28      阅读:165      评论:0      收藏:0      [点我收藏+]

0x0 原理

 技术分享图片

 

关键:【寻找另一处引用这个数据的操作】如果另一处操作直接将1’作为变量带进自身的sql语句中,且未做如转义等处理,那1’的单引号便会发生作用,起到sql注入的效果

 

0x11 演示

以sqlilabs 24关为例

 技术分享图片

 

先点击forget your pass?出来如下页面,看来是提示我们通过注入修改密码

 技术分享图片

 

注册一个新用户,用户名admin4‘#,密码4444

 技术分享图片

 

注册成功

 技术分享图片

 

这时候看数据库,提前留意下admin4的密码

 技术分享图片

 

以刚注册的用户登陆

 技术分享图片

 

修改密码为4111

 技术分享图片

 

再看回数据库

 技术分享图片

 

会发现被修改密码的是admin4,而不是我们登陆的admin4’#,这就是二次注入

 

0x12解析

以24关的代码为例

 

回忆我们刚刚的操作,注册admin4’#,修改admin4’#密码,发现admin4的密码被修改

重点在admin4’#的修改密码操作

对应代码在pass_change.php

 技术分享图片

 

可以看到,执行的sql语句为

$sql=UPDATE users SET PASSWORD = ‘$pass’ where username = ‘$username’ and password = ‘$curr_pass’ ”;

 

当我们以admin4’#的用户修改原密码4444为新密码4111时,执行的对应sql语句就为

$sql=UPDATE users SET PASSWORD =4111where username = ‘admin4’#’ and password =4444’”;

 

这条语句实际执行时产生的效果相当于

$sql=UPDATE users SET PASSWORD =4111where username = ‘admin4’;

 

也就是修改用户admin4的密码为4111,也就造成了二次注入

 

0x2 防御

24关其实在注册,登陆,修改密码的数据带入sql语句前都用了mysql_real_escape_string对特殊字符进行转义,但修改密码中, sql语句中的$username是直接通过$_SESSION["username"]从数据库中提取的,这个变量并未进行处理就被带入sql语句中执行了,进而导致单引号发挥作用,造成注入。

防止二次注入,要么禁止输入数据库的变量中存在非法字符,如果必须要有字符,在数据出库后,也要做好处理

数据的输入输出都要有处理

 

二次注入

原文:https://www.cnblogs.com/Rain99-/p/10595073.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!