当前位置:网站首页>【业务安全-04】万能用户名及万能密码实验
【业务安全-04】万能用户名及万能密码实验
2022-06-27 13:33:00 【像风一样9】
1 实验介绍
1.1 实验目的
由于网页服务端对代码的过滤不够严谨,可能会存在万能用户名或万能密码绕过的风险。
加深对网页代码和SQL代码的理解。
1.2 实验环境
实验靶机——win2008虚拟机:
本节实验靶场是在win2008系统上基于phpstudy搭建的一个简单网站,win2008及phpstudy的安装过程可以参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》,网站的搭建过程可以参考《【(SQL+HTML+PHP)综合】一个简单论坛网站的综合开发案例(具有用户注册、登录、注销、修改信息、留言等功能)》。
本实验在该论坛的登录页面进行实验。

该网站对登录账号密码的验证代码如下所示。

<?php
include "../inc/dblink.inc.php"//将数据库连接的文件包含到此文件中
?>
<html>
<head>
<meta charset="utf-8">
<title> 登录----今日论坛</title>
</head>
<body>
<h1>今日论坛BBS</h1>
<?php
if(isset($_POST['userSubmit'])){
if($_POST['vcode']==$_COOKIE['vcode']){
$userName=$_POST['userName'];
$userPass=$_POST['userPass'];
$sql="select * from users where name='".$userName."' && password='".md5($userPass)."'";
if($results=mysqli_query($link,$sql)){
if(mysqli_num_rows($results)>0){
setcookie('name',$userName,time()+3600*24, "/PHP/jrltbbs");
//注意cookie的路径,不同路径的cookie认为是两条cookie
echo "登录成功,返回<a href='../index.php'>首页</a>或<a href='./index.php'>个人中心</a>";
}else{
echo "用户名或密码错误,<a href='./login.php'>请重新登录</a>";
}
}else{
die("sql语句有误");
}
}else{
echo "验证码错误,<a href='./login.php'>请重新登录</a>";
}
}else{
$html=<<<HTML
<form
method="post">
用户名:<input type="text" name="userName"><br/>
密码:<input type="password" name="userPass"><br/>
验证码:<input type="text" name="vcode">
<iframe src= "./vcode.php" width="100" height=30 frameboder="0"></iframe><br>
<input type="submit" name="userSubmit" value="登录">
</form>
HTML;
echo $html;
}
?>
<hr/>
</body>
</html>
<?php
mysqli_close($link);
?>
根据上述sql语句,可初步分析,关键变量是name,而不是password(无论输入啥,都会进行md5加密,无法进行Sql语句的拼接)
2 实验
2.1 实验分析
(1)上述代码第8行用于在数据库中检验客户端输入账号密码是否存在,而能否登录成功关键在于第10行 if 语句判断条件是否为真,也就是说只要构造的用户名或密码能让SQL语句能成功查询并返回结果,就能实现登录。
(2)由于SQL语句采用的是单引号闭合的方式,因此所构造的语句需要注意屏蔽前后的单引号.
2.2 实验过程
(1)输入网址http://172.16.1.1/PHP/jrltbbs/member/login.php进入网站的登录页面
(2)在登录界面输入用户名aaa' or 1=1#,密码随意,如下,点击登录。
(3)可以看到成功登录。
(4)点击个人中心,可以看到目前登录的账户是数据库中注册的第一个账号。

2.3 实验结果总结—万能用户名及万能密码
采用不同用户名及密码的组合进行实验结果如下。其中表中的万能用户名字母(如aaa和a),要注意用户是数据库中存在的还是不存在的,会导致结果不一样。
| 用户名 | 密码 | 结果 | 分析 |
|---|---|---|---|
| aaa’ or 1=1# | 随意 | 成功 | 采用单引号屏蔽变量前的单引号,采用#注释掉变量后续语句 |
| aaa’ or ‘1’='1 | 随意 | 失败 | 因为and的优先级比or的优先级高,语句先执行’1’=‘1’ and password = '随意’语句得到false,再执行name = ‘aaa’ or false,结果还是false,所以SQL语句无法查询到内容,登录失败. |
| a’ or ‘1’='1 | 随意 | 成功 | 与上一组合不同的是,此处a是刚好碰到数据库中有该用户名,所以or语句执行成功,适合用于爆破特定用户名 |
| a’# | 随意 | 成功 | 此处a是刚好碰到数据库中有该用户名,所以执行成功,适合用于爆破特定用户名 |
| 随意 | aaa’ or 1=1# | 失败 | 由于密码字段在代码中被MD5编码过,无法实现语句构造的功能 |
| 随意 | aaa’ or ‘1’=‘1’ | 失败 | 同上 |
注意:当后台代码对输入参数进行过滤转换时,需要注意思考之前学过的各种绕过技巧。
3 总结
(1)加深理解SQL语句构造与绕过;
(2)掌握万能用户名与密码检测的方法。
边栏推荐
猜你喜欢
随机推荐
jvm 性能调优、监控工具 -- jps、jstack、jmap、jhat、jstat、hprof
What is low code for digital Nova? What is no code
数字化新星何为低代码?何为无代码
PCL库——报错解决:安装时遇到的cmake与anaconda的冲突问题
crane:字典项与关联数据处理的新思路
Cesium realizes satellite orbit detour
my.ini文件配置
SFINAE
Summary of redis master-slave replication principle
Implementing springboard agent through SSH port forwarding configuration
Shell 简明教程
[a complete human-computer interface program framework]
#yyds干货盘点# 解决剑指offer:剪绳子(进阶版)
关于接口测试自动化的总结与思考
【第27天】给定一个整数 n ,打印出1到n的全排列 | 全排列模板
Infiltration learning diary day20
mysql 锁机制与四种隔离级别
一次性彻底解决 Web 工程中文乱码问题
buuctf misc 百里挑一
深入理解位运算



![[安洵杯 2019]Attack](/img/1a/3e82a54cfcb90ebafebeaa8ee1ec01.png)



![[tcapulusdb knowledge base] Introduction to tcapulusdb tcapsvrmgr tool (III)](/img/ce/b58e436e739a96b3ba6d2d33cf8675.png)
![[acwing] explanation of the 57th weekly competition](/img/ef/be89606b0e7fffac08280db0a73781.gif)
