基于php+mysql的sql注入攻防实操

摘要:

基于php+mysql平台的sql注入攻防的实操,提供较详细的ubuntu平台上的操作步骤,方便练手。

使用的平台:

Ubuntu 12.04,php 5.3.10, mysql Ver 14.14, Apache/2.2.22

步骤:

1. 在ubuntu上安装Apache,mysql,具体过程自行百度;

2.1 首先熟悉如何再mysql中建立数据表?包括用户名和对应的密码;并且熟悉其中的查询命令;完成查询测试;

2.2 完成php端的代码,完成php和mysql的链接;完成链接查询测试;

2.3 基于浏览器端的sql攻击测试;

2.1首先是对mysql的操作:

a)创建user数据库:create database user;

b)切换到user数据库:use user;

c)创建account表:create table account(name VARCHAR(20), password VARCHAR(20));里面包含用户的名字和密码;

d)在account表中插入数据:

insert into account values

(‘aaa‘, ‘111‘),

(‘bbb‘, ‘222‘);

即完成在数据库user的account表中插入两个用户的用户名和密码;

2.2 如何将php与mysql相联接?

mysql端需要设置权限,将user数据库的访问权授予findme,并且密码为findmeifyoucan.

grant select, delete on user.*  to findme identified by ‘findmeifyoucan‘;

在php后端需要建立链接的代码如下:

$db = new mysqli(‘localhost‘, ‘findme‘, ‘findmeifyoucan‘, ‘user);

2.3下面分别是浏览器端和php后端的对应的代码(显示原理为主,代码尽量简化);浏览器端的html代码login.html:

<html>
<head>
<title>Please log in.</title>
</head>

<body>

<form action="result.php" method="post">
	Enter your user name:<br />
	<input name="user" type="text" size="40" />
	<br />
	Enter your password:<br />
	<input name="psd" type="text" size="40" />
	<br />
	<input type="submit" name="submit"  value="search" />
</form>

</body>

</html>

下面是php端的代码result.php:

<span style="font-size:14px;"><html>
<head>
<title>see if you can login</title>
</head>

<body>
<h1>Check wether you can login in or not?</h1>

<?php
function check($db)
{
	$name = $_POST["user"];
	$password = $_POST["psd"];

	$result = $db->query("select count(*) from account where name = '$name' and password = '$password'");
	$row = $result->fetch_assoc();

	if($row['count(*)'] != 0){
		echo 'you login in';
	}else{
		echo 'you not login';
	}
}

$db = new mysqli('localhost', 'findme', 'findmeifyoucan', 'user');

if(mysqli_connect_errno()){
	echo 'Error: could not connect to database user. Please try again.';
	exit;
}

check($db);
$db->close();

?>

</body>
</html></span>

在浏览器中,访问localhost/login.html,再输入登陆的用户名和密码即进行测试。上面的代码不能抵御下面sql注入攻击:

如果输入user:aaa, password:111;则顺利登陆;这不奇怪,但是在password处输入下面的代码:112‘ or ‘1‘=‘1, 也可以正常登陆,此时的sql语句如下:

select count(*) from account where name=‘aaa‘ and password=‘112‘ or ‘1‘=‘1‘;

后面的‘1‘=‘1‘逻辑成立,所以返回不为0。

那怎么应对这种情况呢?常见的解决方式是对输入的值进行转义符操作;具体的操作方式如下:

$name=addslashes($name);

$password=addslash3s($password);

这样的操作后,就可以规避112‘ or ‘1‘=‘1的攻击;原因也很简单,因为select查询语句变为如下:

select count(*) from account where name=‘aaa‘ and password=‘112\‘ or \‘1\‘=\‘1‘;

数据库中用户‘aaa‘的密码明显不可能是‘112\‘而且\‘1\‘=\‘1‘也不成立,所以就起到防御作用。

结论:

1. 上述代码虽然简单,但是本人也不是一次就写对,还是借助了php的调试功能,需要区分php在开发和

生产阶段的调试设置的不同;

2. 实践过程再一次证明:只要系统可观察,就可以理解;

时间: 2024-10-25 06:56:27

基于php+mysql的sql注入攻防实操的相关文章

sql注入攻防 以php+mysql为例

随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列.但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,很少或是根本没有考虑应用的安全性问题.这就导致了很多应用都存在不同程度的安全漏洞.SQL注入便是其中的一种. SQL注入作为一种很流行的攻击手段,一直以来都受到网络安全研究者和黑客们的广泛关注.那什么是SQL注入呢?SQL注入是这样一种攻击技术:攻击者通过把恶意SQL命令插入到Web表单的输

SQL注入攻防入门详解(2)

SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口.这几天把sql注入的相关知识整理了下,希望大家多多提意见. (对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门查看大量前辈们的心得,这方面的资料颇多,将其精简出自己觉得重要的,就成了该文

[转]SQL注入攻防入门详解

原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口.这几天把sql注入的相关知识整理了下,希望大家多多提意见. (对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么

SQL注入攻防入门详解

原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口.这几天把sql注入的相关知识整理了下,希望大家多多提意见. (对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么

【转载】SQL注入攻防入门详解

滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长统计|  今日IP[353] | 今日PV[848] | 昨日IP[922] |  昨日PV[2188] |当前在线[10] SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但

mysql中sql注入的随笔

当使用如下登录代码时:就会引发sql注入问题 怎么注入呢? 'or 1=1 # 就可以了. 为什么呢? 首先or:在sql中是或者,只要满足前一个或后一个条件即可,只要所以不论你是 'or 1=1 #还是 'or 2=2 #,都可以. #: 是注释的意思,在sql中注释掉后面的密码判断. 所以这一段不用不用密码即可输入成功, 怎么办呢? 在php中,可以有很多方法....就不举例了. <!doctype html> <html lang="ch"> <he

mysql被sql注入的一次打脸经历

      打脸的一次数据库经历 身为一个运维工程师,平时对于线上的服务器算是十分重视,即使上面有硬件防火墙,然后系统也做了进一步优化,而且还安装了基本防护软件,服务器半年了也没有出现过什么问题.可是我对其他一些不是很重要的服务器却是平时只是简单的维护.因为平时也没有发生什么问题,于是自己变得更懒了,终于有一天,打脸的事情出现了.... 一大早上,看看邮件报警,说什么监控服务器被人家sql注入,有病毒建议清理 看到上面的内容,我的心情现在是久久不能平静,太打脸了.更气人的是哪个fuck,好吧,认

手把手叫你SQL注入攻防(PHP语法)

版权声明:https://github.com/wusuopubupt 闲话不说,直接来! 理论补充:1.http://blog.csdn.net/wusuopubupt/article/details/8752348 2.http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html 1.什么是SQL注入,猛戳wikipedia查看 2.本地测试代码: 如果表单提交正确,就打印hello,“username” 否则,打印“404 not

mysql防SQL注入搜集

SQL注入 例:脚本逻辑 $sql = "SELECT * FROM user WHERE userid = $_GET[userid] "; 案例1:SELECT * FROM t WHERE a LIKE '%xxx%' OR (IF(NOW=SYSDATE(), SLEEP(5), 1)) OR b LIKE '1=1 '; 案例2:SELECT * FROM t WHERE a > 0 AND b IN(497 AND (SELECT * FROM (SELECT(SLE