澳门新葡萄京官网首页php.ini中magic_quote_gpc功能on理解

本文章要介绍一些sql安全知识,告诉你如何做起简单的sql防注入方法及分析黑客是怎么注入的,有需要的朋友可以测试一下,还有更多更好请在本在搜索。

      
虽然如此,攻击者仍然有机会进行SQL注入攻击。。。。。。前提是,当参数为数字型的时候,且未经过Intval()函数的处理,因为经过intval()的处理之后,所有的数据就都会强制转换成数字。

SQL注入攻击(SQL
Injection),是攻击者在表单中提交精心构造的sql语句,改动原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击。

说起防止SQL注入攻击,感觉很郁闷,这么多年了大家一直在讨论,也一直在争论,可是到了现在似乎还是没有定论。当不知道注入原理的时候会觉得很神奇,怎么就被注入了呢?会觉得很难预防。但是当知道了注入原理之后预防不就是很简单的事情了吗?

      
前面已经提到过,开启magic_quote_gpc=on之后,相当于使用addslshes()这个函数。但是数字型没有用到单引号,所以理所当然的绕过了addslshes()函数的转换了。而使用MySQL自带的char()函数或者HEX(),char()可以将参数解释为整数并且返回这些整数的ASCII码字符组成的字符串,使用十六进制表示必须在数字前加上0x。

SQL注入攻击的一般步骤:

澳门新葡萄京官网首页,第一次听说SQL注入攻击的时候还是在2004年,那是还是在写asp呢。在一次写代码的时候,有同事问我,你的这段代码防注入攻击了吗?什么攻击?这是什么呀。
后来到网上各种找,终于弄明白了是怎么攻击进来的了。注入攻击都是来自于客户端,无论是表单提交、URL传值还是Cookie等,其实原理都是一样的。到了服务器端可以分成三种情况:数字、日期时间、字符串。

       实例演示:

1、攻击者访问有SQL注入漏洞的站点,寻找注入点

一、数字。

      
假设我们知道管理员的用户名为admin,密码不知道。并且已经将magic_quote_gpc启用。

2、攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句

如何注入?

       SQL语句:

3、新的sql语句被提交到数据库中执行 处理

假设我们要实现一个显示新闻的页面,我们可能会随手写下下面的代码:

 代码如下

4、数据库执行了新的SQL语句,引发SQL注入攻击

string id = Request.QueryString[id];string sql = select * from news
where ColID= + id;

$sql=”select * from users where
username=$name and password=’$pwd'”;

澳门新葡萄京官网首页 1

如果传递过来的 id是我们想像的
数字,那么自然不会有什么问题。但是如果传递过来的id是168 delete from
table 的话,那么sql的值就变成了select * from table where ColID=168
delete from news。对于SQL
Server来说是支持一次提交多条SQL语句的,这个为我们提供了方便之余也为SQL注入敞开了大门。显然如果这条SQL语句被执行的话,那么news表里的记录就都没有了。

注意:变量$name没加引号

实例

那么如何预防呢?很简单,因为ColID字段的类型是int的,那么我们只需要验证一下传递过来的id是不是整数就可以了。是整数就不存在注入;如果不是那么就有可能存在注入。即使不存在注入,把一个不是整数的id拼接进去也会造成执行错误。
所以说不管是不是为了预防SQL注入,也都应该验证id是不是整数。

       此时,在地址栏中输入username=admin%23,则合成后的sql语句为:

数据库

验证方法嘛,可以用TryParse,可以用正则,也可以自己写函数验证。但是不建议用try异常的方式,因为这个有效率问题。

  

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 ’0000-00-00 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 显示留言  

这里还有一个特殊情况,就是对于批量删除这类的会传递过来多个数字,比如1,2,3,10,这个也需要验证一下,万一有人利用这个漏洞呢。至于验证方法也很简单,自己写个函数就ok了。

 代码如下

页面 可能存在注入点,我们来测试

二、日期时间

select * from users where username=’admin’ #’ and password=”;

and 1=1

这个和数字的情况是一样的,验证是不是日期时间即可。

  这时候通过url地址栏输入的单引号(’)将被加上反斜线,该sql语句将失效。

返回页面

三、字符串

  admin转换成ASCII后是char(97,100,109,105,110)

澳门新葡萄京官网首页 2

最麻烦、争议最大的就是这个了。

  此时在地址栏中输入

澳门新葡萄京官网首页 3

先看一下如何注入

 代码如下

一次查询到记录,一次没有,我们来看看源码

比如我们先要按照新闻标题来进行查询,可能写的代码:

username=char(97,100,109,105,110)%23

//show.php 12-15行

string key = txtTitle.Text;string sql = select * from news where title
like ‘% + key + %’;

  SQL语句就变成了:

// 执行mysql查询语句

这个又是如何注入的呢?我想先问大家一个问题:如果key的值永远都不会包含单引号,那么会不会被注入进来?

  

$query = “select * from postmessage where id = “.$_GET[“id”];

那么用了单引号又是如何注入的呢?假设key= ‘ delete from news —
,那么sql的值就是 select * from news where title like ‘%’ delete from
news — ‘ 。

 代码如下

$result = mysql_query($query)

先用一个单引号和前面的单引号组成一对封闭的单引号,这一对单引号内部就作为字符串处理,而外面的就被作为SQL语句处理,而第二个单引号被
–给注释掉了,这样就保证了整个sql语句的正确性。

select * from users where username=char(97,100,109,105,110)#’ and
password=”;

or die(“执行ySQL查询语句失败:” . mysql_error());

这是注入的一种方法。

  执行结果为真,就可以顺利进入后台。

参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询

那么如何来防止呢?想想刚才的问题,如果没有单引号是不是就天下太平了呢?对于这种情况,到目前为止我是没发现不用单引号,还能够注入进来的方法。也许是我孤陋寡闻吧,不知道各位高手是否知道对于这种情况,不用单引号还能注入进来的方法。

  对于数字型注入攻击,必须在任何的数字型参数放入数据库之前使用intval()对参数进行强制转换成数字,从而可以断绝数字型注入漏洞的产生。

提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1
这语句前值后值都为真,and以后也为真,返回查询到的数据

既然找到了罪魁祸首,那么就好办了,把单引号干掉就ok了。key =
key.Replace(‘, ”);这时候sql的值就是 select * from news where title
like ‘%” delete from news –‘。 对于SQL
来说在一对单引号内部的两个单引号表示一个字符串形式的单引号。这样我们就把罪魁祸首改造成了字符串了。在一对单引号内的–也是普通的字符串而不代表注释。

  比如:

提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2
这语句前值为真,后值为假,and以后为假,查询不到任何数据

罪魁祸首是单引号,想不明白为什么有许多人都去过滤
delete、update这一类的关键字,他们都是安善良民呀,他们是很冤枉的。当然了,如果前提是程序都已经写好了,不能修改内部代码,那就另当别论了。至于–顶多算是帮凶,如果您不放心的话,把他处理了也行。

 代码如下

正常的SQL查询,经过我们构造的语句之后,形成了SQL注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用
union读取管理密码,读取数据库信息,或者用mysql的load_file,into
outfile等函数进一步渗透。

总结:数字、日期时间的,验证类型;字符串的,处理好单引号。
另外为了安全起见,不要用sa连接数据库,xp_cmdshell这一类的有危险的扩展存储过程也应该处理一下。

$id=intval($_GET[‘id’]);

防范方法

  select * from articles where id=’$id’;

整型参数:

  地址栏中输入:

运用 intval函数将数据转换成整数

 代码如下

函数原型

id=5’ or 1=1%23

int intval(mixed var, int base)

  SQL语句将变成:

var是要转换成整形的变量

 代码如下

base,可选,是基础数,默认是10

select * from articles where id=’5’;

浮点型参数:

  而不是select * from articles where id=’5’ or 1=1#;

运用 floatval或doubleval函数分别转换单精度和双精度浮点型参数

总结:

函数原型

对于每一个变量都记得加上单引号,比如where username=’$name’,
开启magic_quote_gpc并不是绝对安全的,对于数字型注入攻击,仅仅使用addslashes()函数进行转换是不够的,还需使用intval()强制将参数转换成数字

int floatval(mixed var)

var是要转换的变量

  int doubleval(mixed var)

var是要转换的变量

字符型参数:

运用
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"]);  } 

再次测试,漏洞已经修补

Injection),是攻击者在表单中提交精心构造的sql语句,改动原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会…

发表评论

电子邮件地址不会被公开。 必填项已用*标注