Python_web_安全

1.前言

Python搭建web服务器,开始慢慢变多,上周音符大屌搭建一个小型ctf给我们玩,里面就有不错的python_web题目。
于是乎学习一下python_web安全,总结一下,方便以后自己翻一下

2.基础

Python语法基础

Python 的web:djiango,web.py等等~

Web.py:
http://webpy.org/tutorial3.zh-cn
http://www.leavesongs.com/PYTHON/webpy-readme.html
Djiango:
http://www.w3cschool.cc/django/django-install.html
基本全是mvc框架的,这些是研究python安全最基础的知识

3.python_web 出现的漏洞

3.1.sql注入

框架没有注入么?不好说,要看程序员了。。。。
这里就有一个注入,可以直接注入
注入

3.2.xss

这也是很有可能出现的~
xss
这里就直接发射型xss了

3.3任意文件读取

Filename参数没过滤好,就会任意文件读取。
任意文件读取
直接http://127.0.0.1/index/readfile?filename=../../../../../../etc/password

另一种任意文件读取情况:
任意文件读取
http://www.baidu.com 改为 file://etc/passwd 造成任意文件读取

3.4 命令执行

与OS命令注入攻击相关的模块: eval、os.system()、os.popen*、subprocess.popen
os.spawn、commands.、popen2.*、pickle

3.4.1.常见就是 直接将传输的数据放到这些函数中执行了,造成命令注入漏洞

请输入图片描述
输入ip|whoami 后面whoami也带入执行了

喜欢写爬虫的黑阔们要小心了,有人喜欢将爬到url放入一个list里面,然后给sqlmap.py来检测注入。例如这样

万一别人来一个 list里面就有一个元素是http://evil.com|rm -rf 最后执行os.system("python sqlmap.py -u http://evil.com|rm -rf / &")
然后你哭晕在厕所

3.4.2.Pickle反序列化造成了命令执行

漏洞原理:http://drops.wooyun.org/papers/66
再文章里面我们知道
pickle.loads() 是可能造造成命令执行的
若loads的内容可控:
import pickle
cPickle.loads("csubprocessnPopennp1n((S'CMD'np2ntp3ntp4nRp5n.")
这里就可以执行命令了

Web.py出现这样问题
值得注意是web.py框架中的session.py 中的decode方法是有这个漏洞的,也就是说要是调用decode就会出现漏洞~~!

你可以这样去改造脚本得到str,去执行你要的命令

4.实例

这里拿音符给的代码讲一下实例:
不方便把代码给大家,直接将有漏洞代码写出来吧

4.1 注入

请输入图片描述
Admin的check方法,Username 没有过滤,直接可以注入:
请输入图片描述
发现2可以显示 直接select flag from flag 注意要有括号!
请输入图片描述

4.2 文件读取

App.py定义的uploads方法 任意文件读取漏洞
请输入图片描述
过滤了../ ,但是我们可以这样改造一下:
请输入图片描述
注意在浏览器里面这样访问时不可以的- -||

4.3命令执行

还是因为session.py 中的decode方法有漏洞,
再音符这个ctf中,base函数的authcode方法 调用decode函数造成代码执行:
请输入图片描述
Cookie中的authcode 会进入decode 这个有漏洞函数。
用我之前给的脚本生成一下basd64 的str加到这个authcode中就触发这个命令执行
请输入图片描述
执行whoami命令
请输入图片描述
over。。。。。。。。感谢音符大屌 带我装逼带我飞~@音符

p神 补充:

web.py里面session.py的问题我说一下。这个根本就是0cms作者为了构造而构造的一种使用方法。
Store是web里存储session的一个类,众所周知session是存储用户身份、凭据的方法,在php里session默认保存在文件中,是用户决不能接触的。

如果像0cms里这样去解析session,等于直接从cookie里拿到session并调用pickle.loads进行解析。
且不论是否会造成命令执行、代码执行,这样解析等于用户完全控制了session(完全控制,而不是控制其中一个对象),那么我可以伪造任意身份,整个网站就都是我的。

有些人可能有疑惑说session有时候我们也能控制,比如注册一个用户名为xxx的用户登录以后session的值就是xxx。但注意这里的xxx只是session中的一个值,你是控制不了session的数据结构的,而一个值是绝对造不成命令执行的。

Store类原本就应该是session.py中的一个内部类,如果拿出来用的话是完全错误的用法,正常程序员是不会这样写。这个用法就好比在php里修改SessionHandler让session从cookie里取。

所以这个漏洞并不是web.py的漏洞。

但我说一个利用情况。

比如我的http://waf.science 是将session保存在redis里的,如果你能发现redis的未授权访问,就可以连接上redis修改其中的值,

这个时候就能在读取session的时候造成代码执行漏洞。
另外,web.py的session默认保存在文件中,如果你能找到一个能够控制session目录中文件的方法,也能造成代码执行漏洞。

标签: lightless@foxmail.com

已有 3 条评论

  1. lufei

    联系平台的源码能公布出来吗?

    1. wilson

      @lufei:代码是音符的,我不好给你

  2. nike lunarglide 5

    He failed to comply.

    1. wilson

      @nike lunarglide 5:I'm sorry, I don't understand.

添加新评论