PS:PHP中绕过GPC的情况有很多,本文仅仅是总结了一些比较常见的,而且写的很浅[因为本人水平有限],欢迎大家积极拍砖:)

1.通过数据库(文本)中转

通过数据库中转:

[注意存入数据库和select出的数据]
用户输入===>gpc\addslashes()==========>数据库=========>执行sql语句\include\写入缓存文件
                                               insert\update                 select                             
                                                  
这个问题是程序员容易忽略的,往往只是依靠gpc或addslashes函数对用户直接输入的数据进行处理,这样数据中的'"等都会被\转义,这样就能正确的执行sql语句,有效防止注入攻击了。但存入数据库的数据呢?在执行完sql语句存入数据库的是经过gpc处理前的原始数据,那么当程序再select出的就是受污染的数据了,如果把select出的数据再执行sql语句,那么就触发了sqlinj,如果直接写入缓存文件的话就有可能直接拿shell了:)

通过文本中转:

用户输入===>gpc\addslashes()===>写入文本文件===>include===>再次写入文本文件\执行sql语句

这个和通过数据库中转大致是一样的,对于写文件的操作如果处理不当是有可能被攻击者直接拿shell的,我们来看看php168的一个代码片段:

function login_logs($username,$password) {
global $timestamp,$onlineip;
$logdb[]="$username\t$password\t$timestamp\t$onlineip";
@include(PHP168_PATH."cache/adminlogin_logs.php");
$writefile="<?php \r\n";
$jj=0;
foreach($logdb AS $key=>$value) {
$jj++;
$writefile.="\$logdb[]=\"$value\";\r\n"; if($jj>200) {
break;
}
}
write_file(PHP168_PATH."cache/adminlogin_logs.php",$writefile);
}

php168在登录后台时如果输入的用户名或密码有误就会执行这个login_logs函数把登录者的信息记录在adminlogin_logs.php,如果用户输入的$username的数据是“";eval($_POST[cmd]); //”,前面的"被闭合了,成功的写入了shell。但如果gpc为on的话,"会被转义成\",无法利用了。但注意这里会先包含adminlogin_logs.php,并循环数组把数据再次写入adminlogin_logs.php,要知道,这里的\仅仅是转义字符,所以include后$logdb依旧是受污染的原数据,再次写入文件时"就起作用了,成功写入了shell。

2.通过编码

UTF-7(+ACc-)===>gpc\addslashes()===>mb_convert_encoding()===>UTF-8(')

这个问题的具体例子可见:http://superhei.blogbus.com/logs/4255503.html

0xbf27===>gpc\addslashes()===>0xbf5c27===>执行sql语句[数据库编码支持多字节]

PHP里的函数大多是把字符串作为单字节进行处理的,那么如果数据库编码支持多字节呢,我们可以利用这个特性引入',而这里,gpc不但没起作用还帮了我们的忙:)
详见:http://shiflett.org/blog/2006/jan/addsl … ape-string

用户输入(经过urlencode\rawurlencode\base64_encode等函数处理)===>gpc\addslashes()===>urldecode\rawurldecode\base64_decode等函数===>执行SQL语句\include

通过二次编码绕过gpc\addslashes,比如'的URL编码二次编码%25%27。

3.一些函数的错误处理

看看下面的函数处理的字符串:

substr($_GET['a'], 1);

假设输入的$_GET['a']为'haha,经过gpc\addslashes()会变为\'haha,再经过substr处理后又变回了'haha.

处理字符串的函数有很多,往往程序员的一个不注意就能给我们带来很多有意思的利用:)

4.字符串和数组

看看下面的代码:

$a = $_GET['a'];
echo $a[1];

输入$_GET['a']为'haha,经过gpc\addslashes()会变为\'haha,看看手册里对字符串的一段描述:

字符串中的字符可以通过在字符串之后用花括号指定所要字符从零开始的偏移量来访问和修改

这里也可以用方括号替代花括号[这是为了兼容较早的PHP版本,其实就是把字符串当数组处理的],有了这个特性我们能做很多事啊,比如这里$a[1]的输出就是'了:),当然具体大的利用要看具体的代码。

5.PHP自身的一些缺陷

PHP5的GPC对$_SERVER的忽略
见剑心的《PHP5绕过缺陷》

PHP某些版本对%00的错误转义

PHP中GPC的更多相关文章

  1. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  2. php 基础代码大全(不断完善中)

    下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...

  3. Main.C中 IO口,中断及串口初始化

    void Port_Init(void) { //CAUTION:Follow the configuration order for setting the ports. // 1) setting ...

  4. PHP中magic_quotes_gpc动态关闭无效的问题

    昨天浏览线上项目,发现了一个问题:部分文本输出中的引号前多了一道反斜杠,比如: 引号内容多了\"反斜杠\" 单从页面展现的结果来看,猜测应该是PHP中的magic_quotes_g ...

  5. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  6. PHP中 magic_quotes_gpc 和 magic_quotes_runtime 区别及其反斜线转义问题

    php中关于反斜线转义: php中数据的魔法引用函数 magic_quotes_gpc  或 magic_quotes_runtime     设置为on时,当数据遇到 单引号' 和 双引号" ...

  7. Asp.Net中的消息处理---MSMQ系列学习(一)

    刚刚毕业一年,比较浮躁,上次面试被问到消息队列,觉得非常的惭愧因为不知道,所以下定决心一定要学会使用它.以前只是听说过有这么个东西,要说是什么,在什么场景下使用却是无从知晓,因为自己也确实没有在项目中 ...

  8. Quartz 2D官方文档翻译(持续更新中)

    转换  核心绘图模型定义了两个完全独立的坐标空间:用户空间,一个是代表文档页,和设备空间,另外一个代表本机设备的分辨率.用户空间坐标是与设备空间中像素分辨率无关的浮点数字.当你想要打印或者显示你的文档 ...

  9. .NET中 类型,对象,线程栈,托管堆在运行时的关系

    .NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...

随机推荐

  1. 算术表达式解析(第二版) C++11版

    //一个简单的计算器代码,主要用来练习C++11新标准的编程技术和stl应用 1 #include<iostream> #include<stack> #include< ...

  2. [工作中的设计模式]装饰模式decorator

    一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...

  3. wpf telerik中的book控件

    下载 telerik中的书本控件,仅供学习使用.

  4. Web设计师值得收藏的10个jQuery特效

    jQuery已经不是什么新鲜的事儿,以前总把它认为是非常难的东西,也就没有认真去了解他了.直到学完CSS的大部分内容,才开始接触这种"write less, do more" 的J ...

  5. 最全html5 meta设置详解 (转)

    meta 详解,html5 meta 标签日常设置   <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html la ...

  6. 2016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:5分钟安装 30分钟入门和浏览常用命令

    14:59 2016/1/112016最新 wamp2.5+windows 10安装CoedSgniffer代码格式检查:注意问题:1.手动安装2.5.0和pear安装方式都成功但是执行时无任何反映, ...

  7. java并发编程(三)线程挂起,恢复和终止的正确方法

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733    下面我们给出不用上述两个方法来实现线程挂起和恢复的策略--设置标志位. ...

  8. Mac&iOS之多线程--转自http://geeklu.com/2012/02/thread/

    http://geeklu.com/2012/02/thread/ 首先循环体的开始需要检测是否有需要处理的事件,如果有则去处理,如果没有则进入睡眠以节省CPU时间. 所以重点便是这个需要处理的事件, ...

  9. 用户点击确认登录,自动跳转下面地址得到code

    PHP获取微信openid 简单教程 WEB   2014年10月29日  10868浏览  6评论 获取code https://open.weixin.qq.com/connect/oauth2/ ...

  10. protected $appends in Laravel

    protected $appends = ['icon']; public function getIconAttribute(){ return Gravatar::src($this->em ...