CTF,一句话木马上传成功了,能看到phpinfo,由于虚拟机没有网下不了hackbar,我就直接在网页.php后面接的?xx=phpinfo();,这个时候抓包用burp在proxy里改post就能查看info,但是这个时候如果从proxy里直接改最后一行xx=system('cat /tmp/flag.php');进入的页面查看源代码只有一个“1”,还是复制不了的那种,不知道是没进去还是怎么回事,试了很多次都是这样,发包到repeater之后,在里面改post就能看到flag。
然后刚才又试了一下,从proxy直接改system又能直接看到flag了,这次哪怕文件名乱输,xx=system('cat /tmp/44489465165.php‘)也能出flag,请问这是什么情况
【以下回答由 GPT 生成】
该问题出现的原因是PHP语言中system()函数的返回值问题。
在PHP中,system()函数是用来执行系统命令并将输出直接打印到标准输出中的。而system()函数的返回值是执行系统命令的结果,成功执行则返回0,执行失败则返回非0值。
在你的情况下,当你在最后一行加上xx=system('cat /tmp/flag.php')时,实际上是执行了cat命令来输出/tmp/flag.php文件的内容。而根据system()函数的返回值规则,如果执行成功,返回值为0,也就是显示一个"1"。如果执行失败,则返回其他非0值。
所以当你直接查看源代码时,只能看到一个"1",因为这是system()函数执行成功时的返回结果,而非文件的内容。
而当你使用抓包工具如burp来修改请求,在proxy中更改system参数时,实际上是修改了执行的命令参数,因此可以直接看到flag。即使输入了错误的文件名,也会返回non-zero值,依然可以显示flag。
所以,如果你想查看到/tmp/flag.php文件的内容,你可以通过修改命令参数来达到目的。例如,可以尝试使用以下命令:
xx=system('cat /tmp/flag.php 2>&1')
这样可以将标准错误输出(stderr)也重定向到标准输出(stdout),可以将错误信息一同显示出来。这样你就可以看到具体的错误信息,进一步判断是否执行成功以及查看具体文件内容。
希望以上解释能帮助你理解问题的原因以及解决方法。如果还有其他问题,请随时提问。