sql注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的sql查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘有一个合法的sql查询在一起,所以说sql注入攻击并不是php的问题而程序员的问题。
sql注入攻击的一般步骤:
1、攻 击者访问有sql注入漏洞的站点,寻找注入点
2、攻击者构造注入语句,注入语句和程序中的sql语句结合生成新的sql语句
3、新的sql语句被提交到数据库中执行 处理
4、数据库执行了新的sql语句,引发sql注入攻击
实例
数据库
create table `postmessage` (
`id` int(11) not null auto_increment,
`subject` varchar(60) not null default “,
`name` varchar(40) not null default “,
`email` varchar(25) not null default “,
`question` mediumtext not null,
`postdate` datetime not null default ‘1970-01-01 00:00:00′,
primary key (`id`)
) engine=myisam default charset=gb2312 comment=’运用者的留言’ auto_increment=69 ;
grant all privileges on ch3.* to ‘sectop’@localhost identified by ‘123456′;
//add.php 插入留言
//list.php 留言列表
//show.php 显示留言
页面 /show.php?id=71 可能存在注入点,我们来测试
/show.php?id=71 and 1=1
返回页面
一次查询到记录,一次没有,我们来看看源码
//show.php 12-15行
// 执行mysql查询语句
$query = “select * from postmessage where id = “.$_get[“id”];
$result = mysql_query($query)
or die(“执行ysql查询语句失败:” . mysql_error());
参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询
提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据
提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据
正常的sql查询,经过我们构造的语句之后,形成了sql注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。
防sql注入方法
$id = intval ($_get[‘id’]);
当然,还有其它的变量类型,如果有必要的话尽量强制一下格式。
字符型参数:
运用 addslashes函数来将单引号”‘”转换成”‘”,双引号”””转换成”””,反斜杠””转换成”\”,null字符加上反斜杠””
函数原型
string addslashes (string str)
str是要检查的字符串
那么刚才出现的代码漏洞,我们可以这样修补
// 执行mysql查询语句
$query = “select * from postmessage where id = “.intval($_get[“id”]);
$result = mysql_query($query)
or die(“执行ysql查询语句失败:” . mysql_error());
如果是字符型,先判断magic_quotes_gpc能无法 为on,当不为on的时候运用 addslashes转义特殊字符
代码如下
if(get_magic_quotes_gpc())
{
$var = $_get[“var”];
}
else
{
$var = addslashes($_get[“var”]);
}
]
sql语句中包含变量加引号
sql代码:
代码如下
select * from article where articleid = ‘$id’
select * from article where articleid = $id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的sql语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为sql语句执行,因此,我们要养成给sql语句中变量加引号的习惯。
3. url伪静态化
url伪静态化也就是url重写技术,像discuz!一样,将所有的url都rewrite成类似xxx-xxx-x.html格式,即有利于seo,又达到了一定的安全性,也不失为一个好办法。但是想实现php防sql注入,前提是你得有一定的”正则”基础。
4. 用php函数过滤与转义
php的sql注入比较重要的一点就是gpc的设置问题,因为mysql4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为on时,提交的变量中所有的 ” ‘ “(单引号)、” ” “(双引号)、” “(反斜线)和空字符都会自动转为含有反斜线的转义字符,给sql注入带来不少的阻碍。
5. 用php的mysql函数过滤与转义
php的mysql操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符或可能引起数据库操作出错的字符转义。
那么这三个功能函数之间有什么区别呢?下面我们来详细讲述下:
① addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,称为一个有效的多字节字符,其中0xbf5c仍会被看做是单引号,所以addslashes无法成功拦截。
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。
另外对于php手册中get_magic_quotes_gpc的举例:
代码如下
if(!get_magic_quotes_gpc()){ $lastname = addslashes($_post[‘lastname’]);}else{ $lastname = $_post[‘lastname’];}
最好对magic_quotes_gpc已经打开的情况下,还是对$_post[‘lastname’]进行检查一下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
代码如下
function daddslashes($string, $force = 0, $strip = false) {
if(!magic_quotes_gpc || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force, $strip);
}
} else
{
$string = addslashes($strip ? stripslashes($string) : $string);
}
}
return $string;
}
命令1 – 写任意文件
mysql有一个内置的命令,可用于创建和写入系统文件。 此命令的格式如下:
代码如下
mysq> select “text” into outfile “file.txt”
此命令的一个大缺点是,它可以被附加到一个现有的查询使用union的sql令牌。
例如,它可以被附加到下面的查询:
代码如下
select user, password from user where user=”admin” and password=’123′
结果查询:
select user, password from user where user=”admin” and password=’123′ union select “text”,2 into outfile “/tmp/file.txt” — ‘
作为对上述命令的结果,在/ tmp / file.txt文件将被创建,包括查询结果。
命令2 – 读任意文件
mysql有一个内置的命令,可以用来读取任意文件。 它的语法很简单。 b .我们将利用这个 b命令计划 。
代码如下
mysql> select load_file(“path_to_file”);
web shell
webshell是polpular并广泛用于执行在web浏览器从shell命令的工具。 .有人称之为这些工具的php炮弹。 我们将创建一个非常简单的webshell,将执行shell命令。
下面是执行的代码php的一个非常基本的外壳是将(参数通过加利福尼亚 ):
代码如下
http://www.bkjia.com/phpjc/629607.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/629607.htmltecharticlesql注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的sql查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘…