资讯专栏INFORMATION COLUMN

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

Sike / 2174人阅读

摘要:目录二次注入攻击二次注入代码分析二次注入攻击二次注入攻击的测试地址和。图插入到数据库中的数据在二次注入中中的代码如下所示。


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注入漏洞。

 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’。


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

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

 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语句中,由于多了一个单引号,所以页面会报错。


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/120782.html

相关文章

  • [理论-学习]Web安全原理剖析-01

    摘要:数据库名的字段名为。例如表示取出第一条记录开始,取出条记录。第二步引用恶意数据开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。注入攻击输入的参数转为编码进行攻击。 声明: 由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个...

    CarlBenjamin 评论0 收藏0
  • Web安全原理剖析(九)——cookie注入攻击

    摘要:目录注入攻击注入代码分析注入攻击注入攻击的测试地址。图数据修改中的为,然后再次访问该,发现页面返回错误。图访问的结果图访问的结果接着使用查询字段,使用注入方法完成此次注入。 ...

    LeviDing 评论0 收藏0
  • 《网络黑白》一书所抄袭的文章列表

    摘要:网络黑白一书所抄袭的文章列表这本书实在是垃圾,一是因为它的互联网上的文章拼凑而成的,二是因为拼凑水平太差,连表述都一模一样,还抄得前言不搭后语,三是因为内容全都是大量的科普,不涉及技术也没有干货。 《网络黑白》一书所抄袭的文章列表 这本书实在是垃圾,一是因为它的互联网上的文章拼凑而成的,二是因为拼凑水平太差,连表述都一模一样,还抄得前言不搭后语,三是因为内容全都是大量的科普,不涉及技术...

    zlyBear 评论0 收藏0
  • Java代码审计连载之—添油加醋

    摘要:在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。代码审计学习之旅总有人问我代码审计该怎么学习,该从哪学习,现在统一回复,表示我也不知道。。。 在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找X...

    dunizb 评论0 收藏0
  • PHP 开发者如何做代码审查?

    摘要:我们做代码审计之前选好工具也是十分必要的。一审计工具介绍代码审计系统功能介绍是一款基于开发的针对代码安全审计的软件。自定义审计规则。黑盒敏感信息泄露一键审计。挖掘这种漏洞主要是检查是否使用了,搜索和。 GitChat 作者:汤青松原文:PHP 开发者如何做代码审查?关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 【不要错过文末彩蛋】 前言 工欲善其事,必先利其器。我们做...

    Achilles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<