信安任务(三):了解文件上传
一、任务内容
学习http协议,熟练使用burpsuit,了解webshell的基础知识,熟练使用中国菜刀,使用phpstudy搭建文件上传靶场(https://github.com/c0ny1/upload-labs),完成前五课
二、任务完成情况
1、学习http协议,熟练使用burpsuit
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在
http和其他几种网络协议
http和其他几种网络协议 [1]
多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信
HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。
Burp Suite是一个免费的网站攻击工具。
它包括proxy、spider、intruder、repeater四项功能。该程序使用Java写成,需要 JRE 1.4 以上版本
1.首先下载安装JAVA JDK(因为burpsuite 是java平台下的,所以电脑要有Java的环境)
下载该程序的源代码
主要功能
1.Target(目标)——显示目标目录结构的的一个功能
2.Proxy(代理)——是一个拦截HTTP/S的代理服务器(抓包),作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。
3.Spider(爬虫)——是一个应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。
4.Scanner(扫描器)[仅限专业版]——是一个高级的工具,执行后,它能自动地发现web 应用程序的安全漏洞。
5.Intruder(入侵)——是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing 技术探测常规漏洞。
6.Repeater(中继器)——是一个靠手动操作来补发单独的HTTP 请求,并分析应用程序响应的工具。
7.Sequencer(会话)——是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。
8.Decoder(解码器)——是一个进行手动执行或对应用程序数据者智能解码编码的工具。
9.Comparer(对比)——是一个实用的工具,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。
10.Extender(扩展)——可以让你加载Burp Suite的扩展,使用你自己的或第三方代码来扩展Burp Suit的功能。
11.Options(设置)——对Burp Suite的一些设置
当访问了https://www.csdn.net/之后,“Target” 功能模块已经将所有访问记录给爬取了下来,并显示在左侧
比较全的使用方法可以在这个博客里面学习,自己还没时间把各项功能都搞懂,就先记录了下来:https://blog.csdn.net/gitchat/article/details/79168613
2、webshell的基础知识
一、webshell是什么?
顾名思义,“web” - 显然需要服务器开放web服务;“shell” - 取得对服务器某种程度上操作权限。
webshell常常被称为匿名用户(入侵者)通过WEB服务端口对WEB服务器有某种程度上操作的权限,由于其大多是以网页脚本的形式出现,也有人称之为网站后门工具。
二、webshell有什么作用?
一方面,webshell被站长常常用于网站管理、服务器管理等等,根据FSO权限的不同,作用有在线编辑网页脚本、上传下载文件、查看数据库、执行任意程序命令等。
另一方面,被入侵者利用,从而达到控制网站服务器的目的。这些网页脚本常称为WEB脚本木马,目前比较流行的asp或php木马,也有基于.NET的脚本木马。
三、webshell的隐蔽性
有些恶意网页脚本可以嵌套在正常网页中运行,且不容易被查杀。
webshell可以穿越服务器防火墙,由于与被控制的服务器或远程主机交换的数据都是通过80端口传递的,因此不会被防火墙拦截。并且使用webshell一般不会在系统日志中留下记录,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员是很难看出入侵痕迹的。
3、熟练使用中国菜刀
下载了一个,但是还具体去使用。。。
4、使用phpstudy搭建文件上传靶场(https://github.com/c0ny1/upload-labs),完成前五课
第一关:直接上传php木马,发现前端报错;
查看源代码,直接修改参数
随后上传成功!
第二关:(对数据包的MIME进行检查)
第二关先进行黑盒测试,发现上传正常图片、修改后缀名的(dama.php改为dama.jpg)、抓包修改后缀名(上传dama.jpg抓包改为dama.php)、修改文件类型(上传dama.php,修改Content-Type: image/gif)成功上传木马;我们查看原代码分析下,发现只对文件类型进行过滤
第三关(禁止上传.asp|.aspx|.php|.jsp后缀文件)
用上面方法发现上传都不行,发现对.asp|.aspx|.php|.jsp后缀名进行了严格的限制。
所以只能上传别的类型的啦,比如尝试用php3,phtml绕过:
直接上传dama.phtml,或者其他文件可以上传成功。
$is_upload = false;
m
s
g
=
n
u
l
l
;
i
f
(
i
s
s
e
t
(
msg = null; if (isset(
msg=null;if(isset(_POST[‘submit’])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(’.asp’,’.aspx’,’.php’,’.jsp’);
f
i
l
e
n
a
m
e
=
t
r
i
m
(
file_name = trim(
filename=trim(_FILES[‘upload_file’][‘name’]);//trim()去点文件的空格
f
i
l
e
n
a
m
e
=
d
e
l
d
o
t
(
file_name = deldot(
filename=deldot(file_name);//删除文件名末尾的点
f
i
l
e
e
x
t
=
s
t
r
r
c
h
r
(
file_ext = strrchr(
fileext=strrchr(file_name, ‘.’);//查找字符在指定字符串中从左面开始的最后一次出现的位置,如果成功,返回该字符以及其后面的字符
f
i
l
e
e
x
t
=
s
t
r
t
o
l
o
w
e
r
(
file_ext = strtolower(
fileext=strtolower(file_ext); //转换为小写这样就不能进行大小写的逃逸了
f
i
l
e
e
x
t
=
s
t
r
i
r
e
p
l
a
c
e
(
′
:
:
file_ext = str_ireplace('::
fileext=strireplace(′::DATA’, ‘’,
f
i
l
e
e
x
t
)
;
/
/
去
除
字
符
串
:
:
file_ext);//去除字符串::
fileext);//去除字符串::DATA
f
i
l
e
e
x
t
=
t
r
i
m
(
file_ext = trim(
fileext=trim(file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
$img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
第四关:禁止上传.asp|.aspx|.php|.jsp等常见后缀文件)
发现使用上面上传的phml或者其他类型的文件,都以失败告终。
但是发下有一个文件是没有过滤,也是我们上传过程中经常用到的.htaccess
.htaccess基础知识重点内容
.htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
它里面有这样一段代码:AllowOverride None,如果我们把None改成All
上传成功
查看源代码,发现了限制条件
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
和上面比就多了这么一些限制条件,但是还是成功绕过
第五关:禁止上传.asp|.aspx|.php|.jsp包括.htaccess等常见后缀文件)
现在这个.htaccess是上传不来。分析下代码发现,他少了这么一行比较出现比较严重的问题。
查看源代码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
第五关没有这个
$file_ext = strtolower($file_ext); //转换为小写
所以我们可以通过大小写进行绕过了:
改变大小写,就可以绕过上传成功