网站首页 > 技术文章 正文
原理:用户向数据库里存入恶意的数据,在数据被插入到数据库之前,肯定会对数据库进行转义处理,但用户输入的数据的内容肯定是一点摸样也不会变的存进数据库里,而一般都默认为数据库里的信息都是安全的,查询的时候不会进行处理,所以当用户的恶意数据被web程序调用的时候就有可能出发SQL注入。
图解:
二次注入比普通的注入更难发现,很难被工具扫描出来。
原理大概知道了,接下来就是实战了
以sql-libs第24关为例
有登录,注册页面
好奇的我就试了一下弱口令登录
啧啧啧,登陆成功了!不过这和本文没有联系,回到正题!
我们利用注册功能,将我们的数据插入数据库里。
登陆试试
登录进去,现在我们修改密码
我们查看一下
我们登录的是admin’#,但是修改的却是admin账号的密码,那为什么admin账号的密码会被改变呢???
我们去靶场源文件pass_chang.php看一下 找到这句话
$ sql = "UPDATE users SET PASSWORD='$ pass' where username='$ username' and password='$ curr_pass' ";
我们的用户名被admin'#传入进去,在数据库里#号为注释符 然后这句话就变成了
$ sql = "UPDATE users SET PASSWORD=’$ pass’ where username=’admin‘#’ and password=’$ curr_pass’ ";
然后就是
$ sql = "UPDATE users SET PASSWORD=’$ pass’ where username=’admin‘
从而将用户名为admin的账号的密码修改了
数据库还是对自己太过相信,认为数据库里的数据都是正常的,当从数据库里调用的时候没有经过过滤,这就造成了二次注入。
在源码里找到了mysql_real_escape_string($_POST["login_user"]);这个函数将我们的输入的数据进行转义
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。 下列字符受影响: \x00 \n \r \ ' " \x1a 如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
emmmm
再次演示一下攻击
先创建一个list.php
<?php include("../sql-connections/sql-connect.php"); error_reporting(0); $sql="SELECT * FROM users ORDER BY id"; $result=mysql_query($sql); $num=mysql_num_rows($result); for ($i=0; $i < $num; ++$i) { $row = mysql_fetch_array($result); $username = $row[1]; $sql_detail = "SELECT * FROM users where username='$username'"; $result_detail=mysql_query($sql_detail); $num_detail = mysql_num_rows($result_detail); for ($j=0; $j < $num_detail; ++$j) { $row_detail = mysql_fetch_array($result_detail); echo<<<END <table border="1" style="table-layout:fixed;" width="1000"> <tr> <th>$row_detail[1]</th> <th>$row_detail[2]</th> </tr> </table> END; } } ?>
我选择把list.php和sql-connect.php放在一起
现在我们在注册一个用户名1’ union select 1,user(),database()#
然后访问list.php
用户名和密码就被打印出来了
我们分析一下流程。
list.php包含了sql-connect.php,我们创建好账号后,再次登录使用1‘ union select 1,user(),database() #
$ username = $row[1]; $ sql_detail = "SELECT * FROM users where username='$ username'";
我们的username传入进去
$ sql_detail = “SELECT * FROM users where username=’1’ union select 1,user(),database() #’”;
也就是语句变成了
$ sql_detail = “SELECT * FROM users where username=union select 1,user(),database() ”;
我们从表里就打印出了账号和密码这张表。
任何技术问题可以留言一起讨论学习~
猜你喜欢
- 2024-09-14 Mysql:替换某个字段中的部分字符串——replace函数
- 2024-09-14 plsql字符串分割浅谈(plsql字符串截取)
- 2024-09-14 oracle函数--INSTR、SUBSTR使用说明和实例讲解
- 2024-09-14 详解Oracle使用substr和instr截取字符串指定位置的字符
- 2024-09-14 mysql 替换某一个字段中的字符串(mysql替换一个字符串的字符函数为)
- 2024-09-14 sql注入总结(sql注入示例)
- 2024-09-14 Mybatis 中的 DAO 接口和 XML 文件里的 SQL他们如何建立关系?
- 2024-09-14 SQL Server - 字符串常用操作(sqlserver 字符类型)
- 2024-09-14 如何在Java中比较字符串?(如何在java中比较字符串个数)
- 2024-09-14 SQL截取函数(substr)与字符串查找函数(Instr)的组合应用
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 480℃启用MySQL查询缓存(mysql8.0查询缓存)
- 460℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 440℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)