01 二次注入原理

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

二次注入,可以概括为以下两步:

  • 第一步:插入恶意数据
    进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

  • 第二步:引用恶意数据
    开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

配合下图可以有更好的理解:

 
二次注入

02 二次注入方法

这里我们使用sqli-labs/Less24为例,进行二次注入方法的练习。

打开页面可以看到一个登陆界面,尝试用admin'#进行注入,失败。

 
测试失败

部分源代码如下:

  1. $username = mysql_real_escape_string($_POST["login_user"]);
  2. $password = mysql_real_escape_string($_POST["login_password"]);
  3. $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

可以看到使用了mysql_real_escape_string进行转义处理,无法进行SQL注入。

继续研究,发现登陆页面可以进行用户注册,这里我们注册一个admin'#的账号,登陆该账号后可以进行密码修改。

 
注册admin'#

注册新用户过程中的处理代码:

  1. if (isset($_POST['submit']))
  2. {
  3. $username= mysql_escape_string($_POST['username']) ;
  4. $pass= mysql_escape_string($_POST['password']);
  5. $re_pass= mysql_escape_string($_POST['re_password']);
  6.  
  7. echo "<font size='3' color='#FFFF00'>";
  8. $sql = "select count(*) from users where username='$username'";
  9. $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
  10. $row = mysql_fetch_row($res);
  11.  
  12. //print_r($row);
  13. if (!$row[0]== 0)
  14. {
  15. ?>
  16. <script>alert("The username Already exists, Please choose a different username ")</script>;
  17. <?php
  18. header('refresh:1, url=new_user.php');
  19. }
  20. else
  21. {
  22. if ($pass==$re_pass)
  23. {
  24. # Building up the query........
  25.  
  26. $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
  27. mysql_query($sql) or die('Error Creating your user account, : '.mysql_error());
  28. echo "</br>";
  29.  
  30. ··················

可以看到传入的usernamepasswordre_password仍均被mysql_escape_string进行了转义处理,但是在数据库中还是插入了admin'#

数据库数据

这是因为当数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反斜杠。

这时,我们用admin'#登陆,并进行密码修改,密码修改为`123456``

 
捕获.PNG

执行后,查看数据库数据:

 
数据库数据2

可以看到admin的密码由原来的123修改为123456

  1. $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
  2. 这是因为上面的数据库更新语句,在用户名为 "admin'#" 时执行的实际是:
  3. $sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";

因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入。

为了更好地演示二次注入的威力,我们创建一个可以打印数据库users表的list.php文件,核心源代码如下:

  1. <?php
  2. include("../sql-connections/sql-connect.php");
  3. error_reporting(0);
  4. $sql="SELECT * FROM users ORDER BY id";
  5. $result=mysql_query($sql);
  6. $num=mysql_num_rows($result);
  7. for ($i=0; $i < $num; ++$i) {
  8. $row = mysql_fetch_array($result);
  9. $username = $row[1];
  10. $sql_detail = "SELECT * FROM users where username='$username'";
  11. $result_detail=mysql_query($sql_detail);
  12. $num_detail = mysql_num_rows($result_detail);
  13. for ($j=0; $j < $num_detail; ++$j) {
  14. $row_detail = mysql_fetch_array($result_detail);
  15. echo<<<END
  16. <table border="1" style="table-layout:fixed;" width="1000">
  17. <tr>
  18. <th>$row_detail[1]</th>
  19. <th>$row_detail[2]</th>
  20. </tr>
  21. </table>
  22. END;
  23. }
  24. }
  25. ?>

此时,按照之前的步骤我们创建一个新用户1' union select 1,user(),database()#,现在访问刚刚创建好的list.php,可以看到:

 
捕获.PNG

这是因为我们在注册新用户时,1' union select 1,user(),database()#被代入数据库,在list.php中的执行情况:

  1. $row[1] 1' union select 1,user(),database()#
  2. 那么
  3. $username = $row[1];
  4. $sql_detail = "SELECT * FROM users where username='$username'";
  5. 的执行结果为:
  6. $sql_detail = "SELECT * FROM users where username='1' union select 1,user(),database()#'";

这更直观地显示了二次注入的威力。

03 二次注入之CTF实例 i春秋上一道二次注入的题型还有WP

原文章:https://www.jianshu.com/p/3fe7904683ac

[转]sql二次注入的更多相关文章

  1. COMMENT SQL二次注入

    这题目太顶了进去随便发个贴,出现登录已经提示用户名和密码了,弱密码登录(得自己去爆破)zhangwei666即可 没啥思路,扫下目录试试,kali的dirb扫到.git泄露githacker得到源码看 ...

  2. 深入浅出带你玩转sqlilabs(五)-布尔/延时盲注与二次注入

    SQL测试-基于布尔,延时盲注 布尔,延时注入常用到的判断语句 regexp regexp '^xiaodi[a-z]' 匹配xiaodi及xiaodi...等 if if(条件,5,0) 条件成立 ...

  3. sql注入时易被忽略的语法技巧以及二次注入

    那些容易被忽略.容易被弄错的地方 sql注入时的技巧 ========================================================================= ...

  4. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 4.全局防护Bypass之二次注入

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.二次注入也是 ...

  5. 【sql注入】简单实现二次注入

    [sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...

  6. Sql 注入详解:宽字节注入+二次注入

    sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshel ...

  7. [网鼎杯 2018]Comment-1|SQL注入|二次注入

    1.打开之后只有一个留言页面,很自然的就想到了二次注入得问题,顺带查看了下源代码信息,并没有什么提示,显示界面如下: 2.那先扫描一下目录,同时随便留言一个测试以下,但是显示需要登录,账户.密码给出了 ...

  8. [网鼎杯2018]Unfinish-1|SQL注入|二次注入

    1.进入题目之后只有一个登录界面,检查源代码信息并没有发现有用的信息,尝试万能密码登录也不行,结果如下: 2.进行目录扫描,发现了注册界面:register.php,结果如下: 3.那就访问注册界面, ...

  9. sqli-labs(十一)(二次注入)

    第二十四关: 这关考验的是sql的二次注入. 这关是一个登陆加注册的功能点,登陆的地方没有注入,账号密码都输入输入'",页面只会显示登陆失败. 但注册账号的地方没有做过滤可以注册带有单引符号 ...

随机推荐

  1. ——JAVA基础部分

    1. 我们能不能声明main()方法为非静态?√ 不能,main()方法必须声明为静态的,这样JVM才可以调用main()方法而无需实例化它的类. 如果从main()方法去掉“static”这个声明, ...

  2. .NET 5 中的正则引擎性能改进(翻译)

    前言 System.Text.RegularExpressions 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1.它在 .NET 实施本身的数百个位置中使用 ...

  3. 自适应线性神经网络Adaline

    自适应线性神经网络Adaptive linear network, 是神经网络的入门级别网络. 相对于感知器, 采用了f(z)=z的激活函数,属于连续函数. 代价函数为LMS函数,最小均方算法,Lea ...

  4. Ubuntu虚拟机查看文件,目录颜色详解

    查看文件 查看Home(不是home)目录下文件: [duanyongchun@localhost ~]$ ls 查看根目录下文件: [duanyongchun@localhost ~]$ cd / ...

  5. [JZOJ5343]健美猫<模拟>

    [思路] 这个是一个非常容易看出来的模拟,但是模拟也是有技巧的 一般人的模拟思路一般就是移动元素或者下标 然后我就看到了一个有趣的思路 建立坐标轴 以i坐标为横坐标,以si为纵坐标,然后画一条斜率为1 ...

  6. 20175314 《Java程序设计》第十一周学习总结

    20175314 <Java程序设计>第十一周学习总结 教材学习内容总结 URL类 URL类是java.net包中的一个类,用URL创建的对象可以获取URL中的资,其包括三部分信息:协议. ...

  7. Ptask公告

    这是一款非常弱鸡的小程序,不喜勿喷 你们好!如在使用中有bug或者有您宝贵的建议请在下方评论区留言或者投递至我的邮箱:Mj_Ymr@outlook.com. 那么我也会不断更新,并在这里贴上各版本的下 ...

  8. linux 访问windows 共享文件

    用到的方法是 CIFS (Common Internet File System)windows自己的网络文件系统 操作系统: Linux为 debian. Windows 为 windows 8   ...

  9. 力软敏捷框架 jfGrid 的使用说明

    很多人使用力软敏捷框架的一个困扰就是表格控件,力软并没有使用常规的jqgrid,而是用了自己的一套 jfgrid.所以今天在这做个简单的说明,如果你有什么疑问也可以在评论区提出来,后期的文章会做说明. ...

  10. eclipse导入项目乱码问题及快键键收集

    1.eclipse导入的项目出现乱码,选择该项目,右键选择最下方的Properties,第一个出现的Resource页面: 在Text file encoding项中,选择other. 目前中文编码主 ...