文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Web中二次注入攻击原理的示例分析

2023-06-25 12:33

关注

这篇文章主要介绍Web中二次注入攻击原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

二次注入攻击

二次注入攻击的测试地址: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所示。

Web中二次注入攻击原理的示例分析 

图40 注册用户名test'

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

Web中二次注入攻击原理的示例分析 

图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所示。

Web中二次注入攻击原理的示例分析 

图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所示。

Web中二次注入攻击原理的示例分析 

图43 使用Union语句的结果

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

Web中二次注入攻击原理的示例分析 

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

二次注入代码分析

二次注入中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')

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

Web中二次注入攻击原理的示例分析 

图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''

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

以上是“Web中二次注入攻击原理的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯