网站地图    收藏   

主页 > 后端 > 网站安全 >

关于转换URL编码的注入的一点总结 - 网站安全

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 记得以前在看文章的时候说,有的时候 改变一下URL编码就可以绕过一些防住入的代码。实现注入。 今天抽时间 把url编码从新学习了一下,做个简单的笔记吧。 首先百度一下:URL编码的介...

记得以前在看文章的时候说,有的时候 改变一下URL编码就可以绕过一些防住入的代码。实现注入。

  今天抽时间 把url编码从新学习了一下,做个简单的笔记吧。

    首先百度一下:URL编码的介绍:

http://baike.baidu.com/view/204662.htm

介绍中使这样定义url编码的:

url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等)作为URL的一部分或者分离地发给服务器。

从定义中,实现URL编码的过程是发生在浏览器端的,也就是在客户端实现的.浏览器把特殊的字符和不能用简单的七位ASCII实现编码的字符,通过URL编码传递给了 服务器。

例如:
 

在FireFox中输入:

http://www.2cto.com /admin/module/sys/test.php?id="     (%22 = ")

查看 提交的请求头信息:

GET /admin/module/sys/test.php?id=%22 HTTP/1.1

浏览器把这些字符经过了URL编码处理,之后送给了服务器。

 

既然这个URL编码是在客服端实现的,那么我们把正常的字符也采用url编码的形式提交的话,结果是什么呢?

and 1=1   url(%61%6E%64%201%3D1)

url中输入:

http://172.16.100.59/admin/module/sys/test.php?id=%61%6E%64%201%3D1

test.php的内容如下:

echo $_GET['id'];

 

结果如下:

and 1=1

 

这说明了,可以在本地提交正常字符URL编码的形式,提交给了服务端是可行的。

在客户端的 url编码就是这样处理的,遇到不能识别的 或者是浏览器内部制定的 字符的时候,浏览器就把这些字符进行URL编码的处理,如果是正常的能识别的字符的话就不经过url编码的处理。当我们把一个浏览器能识别的字符通过url编码处理之后在传递给浏览器的话,那么浏览器直接把这些内容传递给了 服务器。

 

url编码在客户端的传递总结就是这样了,

 

那么下面我们说一下,在服务端是怎么处理的呢?

 

看例子:

test.php的代码如下:

$id = $_GET['id'];

        if($id == "\""){

        echo "me too";

 

访问 http://172.16.100.59/admin/module/sys/test.php?id="

结果 :

me too

 

   从这里可以看出来 在服务端自动把 URL进行了解码处理。

   再来看一下我们常用的 url编码的诸如把:

   1 and 1=1     url(1%20%61%6E%64%201%3D1)

   修改test.php的代码:

   

   $id = $_GET['id'];

        if($id == "1 and 1=1"){

        echo "buxuan";

 

访问:

http://172.16.100.59/admin/module/sys/test.php?id=1%20%61%6E%64%201%3D1

结果是:

buxuan

按照这样结果的话,那么通过URL编码来实现注入的话是根本行不通的啊,那网上好多大牛为什么说可以通过在中方法能实现注入呢 ?

资料上说  是一些asp的防注入脚本中,用来获取客户端的数据的时候调用的是Request.ServerVariables("QUERY_STRING") 来获取url中的内容,依靠这个内置的函数获取过来的URl中的内容都是没有结果解码处理的内容.

 

其实利用url编码注入的漏洞,知识针对那些在防注入程序中是利用Request.ServerVariables("QUERY_STRING")取来的URL。

现在对PHP比较熟悉:

就拿php来说吧,

test.php

echo $_SERVER['QUERY_STRING'];

 

访问:

http://172.16.100.59/admin/module/sys/test.php?id=1%20%61%6E%64%201%3D1

 

输出的结果是:

id=1%20%61%6E%64%201%3D1

 

简单的整理一下url编码在服务端处理:

通过$_GET   $_POST  $_COOKIE 获取过来的参数都是结果url解码之后的数据。

 通过$_SERVER 得到的 内容都是没有经过url解码处理的数据。

应该是和php的处理机制的问题吧

 

$_SERVER直接 获取url中的内容 ,而 $_GET  $_POST 等 是接受了处理之后的内容。

作者:http://hi.baidu.com/bxhack/item/8c9ab4342448453c2f20c45e

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论