网站首页 > 知识剖析 正文
原理:用户向数据库里存入恶意的数据,在数据被插入到数据库之前,肯定会对数据库进行转义处理,但用户输入的数据的内容肯定是一点摸样也不会变的存进数据库里,而一般都默认为数据库里的信息都是安全的,查询的时候不会进行处理,所以当用户的恶意数据被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() ”;
我们从表里就打印出了账号和密码这张表。
任何技术问题可以留言一起讨论学习~
- 上一篇: HTML学习笔记(二)
- 下一篇: HTML标签之表格标签
猜你喜欢
- 2024-11-25 服务器弱口令漏洞上传木马攻击实验
- 2024-11-25 10、Django 新建ipa(通讯录)项目
- 2024-11-25 Vue组件传参:Vue父组件向子组件传参
- 2024-11-25 第5天 | 16天搞定前端,html布局,表格和大块头
- 2024-11-25 如何应用“XML+XSLT”技术分离Web表示层数据和样式
- 2024-11-25 web前端ajax笔记之一
- 2024-11-25 vue3 新特性 computed、watch、watchEffect 看完就会
- 2024-11-25 巧用SqlServer数据库实现邮件自动发送功能
- 2024-11-25 「案例演练」测试器与模板继承
- 2024-11-25 Vue的框架(了解)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)