php里gpc,PHP中GPC

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的错误转义

原文:http://www.cnblogs.com/hanqishihu/p/6224631.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值