您好!欢迎来到北极熊网

北极熊网

热门搜索: 任正非传    神雕侠侣    红楼梦   

Web安全原理剖析(七)——二次注入攻击

  • 时间:2021-09-23 21:53 编辑:佚名 来源:北极熊 阅读:172
  • 扫一扫,手机访问
摘要:目录2.5 二次注入攻击2.6 二次注入代码分析2.5 二次注入攻击  二次注入攻击的测试地址:http://127.0.0.1/sqli/double1.php?username=test 和 http://127.0.0.1/sqli/double2.php?id=1。 其中,double1.php页面的功能是注册用户名,也是插入SQL语句的地方;double2.php页面的功能是通过参数ID读取用户名和用户信息。  第一步,访问d

目录

2.5 二次注入攻击

2.6 二次注入代码分析

2.5 二次注入攻击

  二次注入攻击的测试地址:http://127.0.0.1/sqli/double1.php?username=test 和 http://127.0.0.1/sqli/double2.php?id=1。 其中,double1.php页面的功能是注册用户名,也是插入SQL语句的地方;double2.php页面的功能是通过参数ID读取用户名和用户信息。


  第一步,访问double1.php?username=test’,如图40所示。


图40 注册用户名test'


  从页面返回结果可以看到用户名test’对用的ID为9,访问double2.PHP?id=9,结果如图41所示。


图40 访问test'的信息


  从返回结果可以看到服务端返回了MySQL的错误(多了一个单引号引起的语法错误),这时回到第一步,先访问double1.php?username=test’ order by 1–+,获取一个新的id=10,当再次访问double2.php?id=10时,页面返回空白;再次尝试,访问double1.php?username=test’ order by 10–+,获取一个新的id=11,当再次访问double2.php?id=11时,页面返回错误信息(Unknown column ‘10’ in ‘order clause’),如图42所示。


图42 访问order by 10的结果


  这说明空白页面就是正常返回,通过不断地尝试,笔者判断出数据库中一共有3个字段。


  访问double1.php?username=test’ union select 1,2,3–+,获取一个新id=12,再访问double2.php?id=12,发现页面返回了union select中的1和2字段,结果如图43所示。


图43 使用Union语句的结果


  在2或3的位置,插入我们的语句,比如访问double1.php?username=test’ union select 1,user(),3–+,获得新的id=13,再访问double2.php?id=13,得到user()的结果,如图44所示,使用此方法就可以获取数据库中的数据。


图44 利用二次注入获取数据

2.6 二次注入代码分析

  二次注入中double1.php页面的代码如下所示,实现了简单的用户注册功能,程序获取到GET参数username的参数password,然后将username和password拼接到SQL语句,使用insert语句插入到数据库中。由于参数username使用addslashes进行转义(转义了单引号,导致单引号无法闭合),参数password进行了MD5哈希,所以此处不存在SQL注入漏洞。


<?php header('Content-type:text/html;charset=utf-8');

$con=mysqli_connect("localhost","root","root","test");

if (mysqli_connect_errno())

{

    echo "连接失败: " . mysqli_connect_error();

}


$username = @$_GET['username'];

$password = @$_GET['password'];


$result = mysqli_query($con,"insert into users(`username`,`password`) values ('".addslashes($username)."','".md5($password)."')");

echo "新的id为:".mysqli_insert_id($con);

?>


  当访问username=test’&password=123456时,执行的SQL语句为:


insert into users(`username`,`password`) values ('test'','e10adc3949ba59abbe56e057f20f883e')

1

  从图45中的数据库里可以看到,插入的用户是test’。


图45 插入到数据库中的数据


  在二次注入中double2.php中的代码如下所示。首先将GET参数ID转换成int类型(防止拼接到SQL语句时,存在SQL注入漏洞),然后到users表中获取ID对应的username,接着到person表中查询username对应的数据。


<?php header('Content-type:text/html;charset=utf-8');

$con=mysqli_connect("localhost","root","root","test");

if (mysqli_connect_errno())

{

    echo "连接失败: " . mysqli_connect_error();

}

$id = intval(@$_GET['id']);


$result = mysqli_query($con,"select * from users where `id`=".$id);

$row = mysqli_fetch_array($result);


$username = $row['username'];

$result2 = mysqli_query($con,"select * from person where `username`='".$username."'");

if (!$result2)

{

    echo mysqli_error($con);

    exit();

}


if($row2 = mysqli_fetch_array($result2))

{

    echo $row2['username'] . " : " . $row2['money'];


}

else

{

    echo mysqli_error($con);

}

?>


  但是此处没有对$username进行转义,在第一步中我们注册的用户名是test’,此时执行的SQL语句为:


select * from users where `username`='test''

1

  单引号被带入SQL语句中,由于多了一个单引号,所以页面会报错。

  • 全部评论(0)
上一篇:已是第一篇内容
下一篇:英特尔回应 CPU 发现关键漏洞:对客户安全暂无风险
资讯详情页最新发布上方横幅
最新发布的资讯信息
【今日头条|头条】当代的丑态丛生,资本已经到了无耻地步(2021-11-20 23:44)
【今日头条|头条】搜狐视频会员 2021年11月17日更新第4批 小爸爸搜狐视频,搜狐视频大视野,为什么艾九影视看不了火影忍者?(2021-11-18 12:03)
【程序人生|Python】Python 之父:Python 4.0 可能不会来了(2021-11-10 22:48)
【今日头条|头条】低代码发展正当时,中国有望超过美国成为全球低代码开发领域的领导者(2021-11-03 21:32)
【今日头条|头条】网盘免费下载速度慢?有好消息了(2021-11-02 21:07)
【今日头条|头条】尽快卸载这两款恶意浏览器插件!已有近50万用户安装(2021-11-01 20:52)
【今日头条|头条】都2021年了,这个国家一半电脑还在使用Windows XP(2021-10-30 22:51)
【技术文档|架构】一个轻量级、高性能的 C++ Web 框架(2021-10-30 21:02)
【程序人生|Python】10分钟教你搭建一个好玩的Python全文搜索引擎(2021-10-28 21:36)
【今日头条|前沿科技】Safari浏览器正在杀死Web(2021-10-27 19:54)
联系我们
电话:18936411277
邮箱:1044412291@qq.com
时间:09:00 - 19:00
公众号:北格软件
底部广告