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
目录
相关文章
|
6月前
|
PHP
利用一段代码轻松绕过PHP授权系统
利用一段代码轻松绕过PHP授权系统
59 0
|
6月前
|
安全 PHP
PHP反序列化--_wakeup()绕过
PHP反序列化--_wakeup()绕过
|
11月前
|
人工智能 安全 PHP
PHP特性之CTF中常见的PHP绕过
PHP特性之CTF中常见的PHP绕过
512 1
|
11月前
|
PHP
unserialize3(php序列化、反序列化及绕过)
unserialize3(php序列化、反序列化及绕过)
141 0
|
SQL PHP 数据安全/隐私保护
PHP审计-后台绕过登录
PHP审计-后台绕过登录
|
程序员 Shell 测试技术
文件上传-PHP异或绕过WAF
文件上传-PHP异或绕过WAF
文件上传-PHP异或绕过WAF
|
算法 PHP 开发者
ecshop | php接入支付宝申报海关接口的总结【避坑】
ecshop | php接入支付宝申报海关接口的总结【避坑】
404 0
ecshop | php接入支付宝申报海关接口的总结【避坑】
|
缓存 算法 Java
PHP面试总结
PHP面试总结
143 0
|
存储 运维 PHP
PHP 继承总结|学习笔记
快速学习 PHP 继承总结
|
SQL 安全 程序员
那些登录被绕过的php代码都长什么样
尽管我自己很少做开发,但是我知道找bug和改bug的经历就像便秘一样难受。语法以及功能性的bug对于普通程序员来说还是相对容易找到的,但是对没有经过专门的安全培训的人来说,很难发现涉及安全方面的bug,准确地说是漏洞。 一般大公司的产品上线之前都会有专门的安全工程师对代码进行审计,一般是借助工具进行半自动或纯手动地审计,这可以使产品的安全性得到很大的保障。但即使这样也无法百分之百保证不会爆出漏洞,更何况是小公司,甚至是一些的个体户,这样的群体里的程序员几乎就是万金油,开发和审计的活都干了,当然质量就大打折扣了。
那些登录被绕过的php代码都长什么样
下一篇
无影云桌面