PHP中GPC绕过的一些总结

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

ryat[at]wolvez.org
http://www.wolvez.org
2007-10-18

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/ja ... -real-escape-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绕过缺陷》: http://www.xfocus.net/articles/200608/878.html

PHP某些版本对%00的错误转义
http://www.securiteam.com/windowsntfocus/6M00K0AC1I.html
目录
相关文章
|
9天前
|
安全 PHP
PHP反序列化--_wakeup()绕过
PHP反序列化--_wakeup()绕过
|
4月前
|
人工智能 安全 PHP
PHP特性之CTF中常见的PHP绕过
PHP特性之CTF中常见的PHP绕过
62 1
|
4月前
|
PHP
unserialize3(php序列化、反序列化及绕过)
unserialize3(php序列化、反序列化及绕过)
44 0
|
11月前
|
SQL PHP 数据安全/隐私保护
PHP审计-后台绕过登录
PHP审计-后台绕过登录
|
程序员 Shell 测试技术
文件上传-PHP异或绕过WAF
文件上传-PHP异或绕过WAF
文件上传-PHP异或绕过WAF
|
缓存 算法 Java
PHP面试总结
PHP面试总结
111 0
|
算法 PHP 开发者
ecshop | php接入支付宝申报海关接口的总结【避坑】
ecshop | php接入支付宝申报海关接口的总结【避坑】
354 0
ecshop | php接入支付宝申报海关接口的总结【避坑】
|
存储 运维 PHP
PHP 继承总结|学习笔记
快速学习 PHP 继承总结
77 0
|
PHP 数据库
关于php mysqli函数的一些总结和详细介绍(五)
前言:php是一门入门比较简单的编程语言,同时php有非常多的内置函数。所以对于这些内置函数的理解与掌握就显得尤为重要。接下来我们就分析php的一些内置函数。后续我还会继续为大家整理。 关于phpMysqli函数的理解: 一、什么是php mysqli? php mysqli = php nysqli improved mysqli函数允许您访问数据库服务器。
7145 0
|
PHP 关系型数据库 MySQL
关于php mysqli函数的一些总结和实例(四)
前言:php是一门入门比较简单的编程语言,同时php有非常多的内置函数。所以对于这些内置函数的理解与掌握就显得尤为重要。接下来我们就分析php的一些内置函数。后续我还会继续为大家整理。关于phpMysqli函数的理解: 一、什么是php mysqli? php mysqli = php nysqli improved mysqli函数允许您访问数据库服务器。
2012 0