- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章万能密码的SQL注入漏洞其PHP环境搭建及防御手段由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这个渗透环境的搭建有以下几点:
$_SESSION['...']
会获取用户session
在MySQL中使用source命令即可运行脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
drop
database
if exists lab;
create
database
lab;
use lab;
create
table
users
(
id
int
not
null
auto_increment,
username
char
(32)
not
null
,
passcode
char
(32)
not
null
,
primary
key
(id)
);
insert
into
users(username,passcode)
values
(
'admin'
,
'admin123'
);
insert
into
users(username,passcode)
values
(
'alice'
,
'alice456'
);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<html>
<head>
<meta charset=
"UTF-8"
>
<title>Login</title>
<style>
#a {
width: 500px;
text-align: center;
}
.b {
width: 200px;
height: 30px;
}
</style>
</head>
<body>
<div id=a>
<h2>Login!</h2>
<form
name
=
"form_login"
method=
"POST"
action
=
"check_login.php"
>
Username:<input type=
"text"
class=
"b"
name
=
"username"
/><br> <br>
Password
:<input type=
"password"
class=
"b"
name
=
"password"
/><br>
<input type=
"submit"
name
=
"Submit"
value=
"Submit"
/>
<input type=
"reset"
name
=
"reset"
value=
"Reset"
/>
</form>
</div>
</body>
</html>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
include(
'con_database.php'
);
$username=isset($_POST[
'username'
])?$_POST[
'username'
]:
''
;
$
password
=isset($_POST[
'password'
])?$_POST[
'password'
]:
''
;
if($username==
''
|| $
password
==
''
){
echo
"<script>alert('请输入账号和密码!')</script>"
;
exit;
}
$sql=
"select * from users where username='$username' and passcode='$password'"
;
$query=mysqli_query($con,$sql)
or
die(
'SQL语句执行失败'
.mysqli_error($con));
if ($row=mysqli_fetch_array($query)){
session_start();
$_SESSION[
'username'
]=$row[1];
echo
"<a href='welcome.php'>欢迎访问</a>"
;
}
else
{
echo
"<script>alert('登录失败!');history.go(-1)</script>"
;
}
mysqli_close($con);
?>
|
1
2
3
4
|
<?php
$con=mysqli_connect(
'127.0.0.1'
,
'root'
,
'root'
)
or
die(
"数据库连接失败!"
);
mysqli_select_db($con,
'lab'
)
or
die(
"数据库连接失败"
);
?>
|
1
2
3
4
5
6
|
<?php
session_start();
session_unset();
session_destroy();
echo
"注销成功"
;
?>
|
1
2
3
4
5
6
7
8
9
10
|
<?php
session_start();
if(isset($_SESSION[
'username'
])){
echo
"欢迎用户"
.$_SESSION[
'username'
].
"登录"
;
echo
"<br>"
;
echo
"<a href=logout.php>退出登录</a>"
;
}
else
{
echo
"您没有权限访问"
;
}
?>
|
至此,我们的渗透环境就构建好了 。
入' or 1=1 or'
,密码随意,发现可以登录进去 'or '1=1
也可以登录进去当然登录方法不止一种:
原来查询语句是这样的:
$sql="select * from users where username='$username' and passcode='$password'",
经过注入之后,变成:
$sql="select * from users where username='' or 1=1 or ' and passcode='****'",
我们观察到,where后面呃字句中的username被闭合,并且字句分成三个句子并用or连接。 在SQL语句中 and的优先级要大于or,所以1=1先判断,为真,即where后面的语句为真,即整个SQL语句为真,即表示查询正确 而形成的语句可以将整个users表查询,后面的$row=mysqli_fetch_array($query)选择的是查询的第一行值,这样满足了SQL语句并跳过了登录验证 由此可以引申出,只要where后面字句为真,即可跳过验证,有如下衍生方法:
' or 1=1 #
' or 1=1 --
(后面有空格)'or"="or'
可以使用正则表达式限制用户的用户名输入,比如:/^[a-z0-9A-Z_]{5,16}$/ 这个限制了用户5位以上16位以下的字母数字下划线为用户名的输入 这个限制在check_login.php中添加 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
include(
'con_database.php'
);
$username=isset($_POST[
'username'
])?$_POST[
'username'
]:
''
;
$
password
=isset($_POST[
'password'
])?$_POST[
'password'
]:
''
;
if (!preg_match(
"/^[a-Z0-9A-Z_]{5,16}$/"
,$username)){
echo
"<script>alert('用户名格式错误')</script>"
;
exit;
if($username==
''
|| $
password
==
''
){
echo
"<script>alert('请输入账号和密码!')</script>"
;
exit;
}
$sql=
"select * from users where username='$username' and passcode='$password'"
;
$query=mysqli_query($con,$sql)
or
die(
'SQL语句执行失败'
.mysqli_error($con));
if ($row=mysqli_fetch_array($query)){
session_start();
$_SESSION[
'username'
]=$row[1];
echo
"<a href='welcome.php'>欢迎访问</a>"
;
}
else
{
echo
"<script>alert('登录失败!');history.go(-1)</script>"
;
}
mysqli_close($con);
}
?>
|
1
2
|
$username=isset($_POST[
'username'
])?addslashes($_POST[
'username'
]):
''
;
$
password
=isset($_POST[
'password'
])?mysqli_real_escape_string($con,$_POST[
'password'
]):
''
;
|
因为使用的是UTF-8编码,不是宽字节编码,形成的'会被变成%5c%27 Windows下默认的是宽字节的gbk编码 如果在%5c前面加上一个字符形成一个复杂的汉字,那么单引号仍然会被输出 。
在使用参数化查询的情况下,服务器不会将参数的内容是为SQL指令中的一部分 而是在数据库完成SQL指令的编译之后,再代入参数运行 此时就算参数里面有恶意数据 但是此时SQL语句以及编译完成 就不会被数据库运行 。
PHP提供了三种访问mysql数据库的拓展:
PDO和MySQLi提供面向对象的api MySQLi也存在面向过程的api,所以容易从MySQL转换到MySQLi 。
下面是mysqli形式的check_login.php 写法,新建check_login_mysqli.php 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php
include(
'con_database.php'
);
$username=isset($_POST[
'username'
])?$_POST[
'username'
]:
''
;
$
password
=isset($_POST[
'password'
])?$_POST[
'password'
]:
''
;
if($username==
''
||$
password
==
''
){
echo
"<script>alert('错误!');history.go(-1);</script>"
;
exit;
}
$sql=
"select * from users where username=? and passcode=? ;"
;//问号表示需要一个参数
$stmt=$con->
prepare
($sql);//预编译SQL语句
if(!$stmt){
echo
'prepare 执行错误'
;
}
else
{
$stmt->bind_param(
"ss"
,$username,$
password
); //为预编译绑定SQL参数,ss表示两个字符串
//i——
int
d——
double
s——string b——boolean
$stmt->
execute
();
$result=$stmt->get_result();
$row=$result->fetch_row();
if($row){
session_start();
$_SESSION[
'username'
]=$row[1];
echo $row[1].
"<a href='welcome.php'>欢迎访问</a>"
;
}
else
{
echo
"<script>alert('登录失败!!');history.go(-1);</script>"
;
}
$stmt->
close
();
}
$con->
close
();
?>
|
一些内容已经标记在代码的注释里面 参数化的PHP代码真的能够很有效地防止SQL注入.
以上就是万能密码的SQL注入漏洞其PHP环境搭建及防御手段的详细内容,更多关于万能密码的SQL注入 PHP环境搭建 防御手段的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/Zeker62/p/15216324.html 。
最后此篇关于万能密码的SQL注入漏洞其PHP环境搭建及防御手段的文章就讲到这里了,如果你想了解更多关于万能密码的SQL注入漏洞其PHP环境搭建及防御手段的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Internal Server Error: /admin/account/customuser/add/ Traceback (most recent call last): File "C:\
有问题!虽然我发现几乎相似的线程但没有帮助:( 我编写了一个 php 脚本来从我的 MySQL 数据库中获取注册用户的数量。该脚本在我的本地主机上运行良好;它使用给定的用户名、密码和主机名,分别是“r
我正在做一项基于密码的作业,我将 key 和消息放在单独的数组中。我想创建第三个数组,其中包含围绕消息大小的 key ,如下所示: message keykeyk 我已经在这个问题上苦苦挣扎了一段时间
我的几个客户要求我实现图形密码检查器,例如 关于如何实现这种 UI 有什么想法吗? 最佳答案 试着看看这个:https://code.google.com/p/android-lockpattern/
我正在使用 MAMP,每次登录 phpMyAdmin 时,都会收到以下错误/警告消息: the configuration file now needs a secret passphrase (bl
我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码
使用具有指定用户名和密码的 SVN 提交。我希望服务器抛出错误;所以我可以告诉我的用户他/她的密码错误。 相反,在使用错误密码提交后: svn commit "test_file.txt" --use
我正在尝试实现 friend 推荐。 它从节点“你”开始。而且,我想找到节点“安娜”。 换句话说,这是我的两个或更多 friend 共同认识的人。上面的示例节点是 Anna。 如果您的帮助,我将不胜感
我都尝试过 wget --user=myuser --password=mypassword myfile 和 wget --ftp-user=myuser --ftp-password=mypass
我的一位用户提示说,每当他尝试使用默认管理界面(Django 的管理员)添加新用户(auth.User)时,新用户名和密码都会自动填充他自己的。 问题是他在登录时要求 Firefox 记住他的用户名/
我们正在开发一款应用(当然)用于应用购买 (IAP)。我已完成指南中的所有操作以启用 iap,并且一切正常,直到我想要购买为止。 部分代码: MainViewController.m -(vo
我试图创建两个可选匹配项的并集(如下所示),但我得到的不是并集,而是两者的交集。我应该如何更改此查询以获得所需的联合? optional match (a:PA)-[r2:network*2]-(b:
我想将Ansible用作另一个Python软件的一部分。在该软件中,我有一个包含其用户名/密码的主机列表。 有没有一种方法可以将SSH连接的用户/密码传递给Ansible ad-hoc命令或以加密方式
嗨,我在使用xampp的Apache Web服务器上收到错误500。直到我使用.htaccess,.htpasswd文件,错误才出现。我搜索了,但找不到语法错误。我只有1张图片和要保护的索引文件。以下
我一直使用它来编辑用户帐户信息: $this->validate($request, [ 'password' => 'min:6', 'password_confirmation'
我需要使用InstallUtil来安装C# Windows服务。我需要设置服务登录凭据(用户名和密码)。这一切都需要默默地完成。 有没有办法做这样的事情: installutil.exe myserv
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如果我有一个随机的、16 个字符长的字母数字盐(不同大小写),它是为每个用户生成和存储的,我是否还需要一个站点范围的盐? 换句话说,这样好吗? sha1($user_salt . $password)
我正在开发一个空白程序,该程序将允许用户创建一个帐户,以便他们可以存储其余额和提款/存款。用户输入用户名和密码后,如何存储这些信息以便用户可以登录并查看其余额?我不一定要尝试使其非常安全,我只是希望能
我正在尝试寻找一种通用方法来搜索没有链接到另一个节点或节点集的节点或节点集。例如,我能够找到特定类型(例如 :Style)的所有节点,这些节点以某种方式连接到一组特定的节点(例如 :MetadataR
我是一名优秀的程序员,十分优秀!