狠狠撸

狠狠撸Share a Scribd company logo
笔测迟丑辞苍安全编码&?自动审计
xxlegend
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对于我
?? 廖新喜
?? 绿盟科技安全研究员
?? 专注于web安全,代码审计,安全产物的开发
?? ??网名:xxlegend
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
?? 常?见安全漏洞
(1)sql注?入
(2)命令注?入
(3)代码注?入
(4)XSS
(5)CSRF
(6)路径穿越
(7)?文件上传
(8)XXE
(9)SSRF
(10)不安全封装
?? ?自动化审计
??目录
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
Sql注?入
原因:直接拼接数据字段操作数据库
常?见注?入接?口:
(1)django的raw()?方法,execute()?方法,extra()?方法where处
(2)直接调?用psycopg2或其他底层接?口
错误?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
(1)参数验证,如限定?用户名(a-zA-Z_0-9)
(2)django的model API,如QuerySet
(3)参数化查询
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
命令注?入
?? 命令注?入通常是因为调?用shell来实现?一些功能导致
?? 常?见的易导致命令的接?口:
os.system
os.popen
os.spaw*
os.exec*
os.open
os.popen*
commands.call,
commands.getoutput,
Popen*
?? ?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 封装命令执?行API,过滤所有shell元字符
?? 使?用subprocess模块,同时确保shell为False,默认情况
是False
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
XSS
?? 原因:未对输?入输出做过滤或者框架中的?一些例外
?? django常?见例外情形:
(1)属性有动态内容,如<img alt={{foo}}>
(2)使?用了mark_safe,autoescape
(3)Dom类型xss
(4)HttpResponse返回动态内容
?? 错误?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 属性内容中加上双引号,如<img alt=“{{foo}}”>
?? 确保mark_safe,autoescape的内容是安全的
?? HttpResponse不返回动态内容
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
CSRF
?? 在django中默认加?入了CSRF中间件
django.middleware.csrf.CsrfViewMiddleware
?? 在post表单中添加csrf_token,<form action="."
method="post">{% csrf_token %}
?? 在相应的view函数中,引?入csrf或者加上csrf_protect装饰
器
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
代码注?入
?? 原因:eval和pickle.loads等接?口未过滤参数造成的
?? 错误?示例:
?? 利?用:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
代码注?入
pickle.loads利?用代码:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 严格验证参数,?非法字符直接返回
?? 使?用ast.literal_eval()
?? 推荐使?用json格式
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
路径穿越
?? 原因:路径参数可控导致任意?文件下载,删除,写?入,覆
盖
?? 错误?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 严格验证参数范围,?非法字符直接返回
?? 过滤..和.字符
?? ?示例:django.views.static?示范代码
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
任意?文件上传
(1)只在js端判断,未在后端验证
(2)未限定后缀,或者后缀?黑名单,导致恶意?文件上传
(3)未给?文件重命名,导致上传?文件名可猜测
(4)未限定?大?小,导致dos
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
XXE
?? XXE:XML外部实体攻击(XML External Entity),通过xml
外部实体获取服务器中的数据
?? 原因:libxml2.9以下默认导?入外部实体,lxml中默认采?用
XMLParser
注意两个关键参数,resolve_entities=True会导致解
析外部实体,no_network=True则限制不能将数据导
出到外部,会导致?一些ssrf问题。
?? Xml.dom.minidom,xml.etree.ElementTree不受影响
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
XXE
错误?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 升级libxml为2.9或者以上
?? 使?用XMLParser的过程中设置resolve_entities=False
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
SSRF
?? SSRF(Server-Side Request Forgery:服务器端请求伪造),
是由攻击者从服务端发起请求的漏洞
?? 成因:服务端提供了从其他服务器应?用获取数据的功能
且没有对??目标地址做过滤与限制
?? ?示例:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
?? 严格限定请求的协议,仅仅允许http和https
?? 过滤返回信息,验证远程服务器对请求的响应
?? 限制请求的端?口为http常?用端?口
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
不安全的封装
?? eval封装不彻底,仅将__builtings__置为
空
?? 原理:
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
对策
尽量使?用owasp推荐的api接?口
封装全?面,过滤严格
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
?自动审计
?? 语法树:利?用python的静态分析模块ast
?? 基本原理:危险函数+可控参数
?? 过程:
(1)递归遍历语法树,分析每个函数执?行的语句,得到可控参数列表
(2)判断执?行的语句是否有危险函数
(3)如果有危险函数,分析其参数是否在可控列表之中
(4)符合这两个条件则认为是新的危险函数
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
?自动审计
如何得到可控参数?
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
演化过程
?? 从ast到pysonar2
?? 处理类及__init__函数
?? 处理import语句
?? 处理安全函数
?? 判断语句中含危险函数
?? 增加对os.remove类似识别不仅仅是
remove
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
踩过的坑
?? 从ast到pysonar2
?? 对python语法结构了解不全,导致分析语
法树考虑不周
?? 递归处理参数查找
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
Q&A
shengqi158@163.com
https://github.com/shengqi158/pyvulhunter
北京/上海/??广州 0xFF Life's pathetic, go Pythonic!

More Related Content

笔测迟丑辞苍安全编码

  • 2. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对于我 ?? 廖新喜 ?? 绿盟科技安全研究员 ?? 专注于web安全,代码审计,安全产物的开发 ?? ??网名:xxlegend
  • 3. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
  • 4. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic!
  • 5. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! ?? 常?见安全漏洞 (1)sql注?入 (2)命令注?入 (3)代码注?入 (4)XSS (5)CSRF (6)路径穿越 (7)?文件上传 (8)XXE (9)SSRF (10)不安全封装 ?? ?自动化审计 ??目录
  • 6. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! Sql注?入 原因:直接拼接数据字段操作数据库 常?见注?入接?口: (1)django的raw()?方法,execute()?方法,extra()?方法where处 (2)直接调?用psycopg2或其他底层接?口 错误?示例:
  • 7. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 (1)参数验证,如限定?用户名(a-zA-Z_0-9) (2)django的model API,如QuerySet (3)参数化查询
  • 8. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 命令注?入 ?? 命令注?入通常是因为调?用shell来实现?一些功能导致 ?? 常?见的易导致命令的接?口: os.system os.popen os.spaw* os.exec* os.open os.popen* commands.call, commands.getoutput, Popen* ?? ?示例:
  • 9. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 封装命令执?行API,过滤所有shell元字符 ?? 使?用subprocess模块,同时确保shell为False,默认情况 是False
  • 10. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! XSS ?? 原因:未对输?入输出做过滤或者框架中的?一些例外 ?? django常?见例外情形: (1)属性有动态内容,如<img alt={{foo}}> (2)使?用了mark_safe,autoescape (3)Dom类型xss (4)HttpResponse返回动态内容 ?? 错误?示例:
  • 11. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 属性内容中加上双引号,如<img alt=“{{foo}}”> ?? 确保mark_safe,autoescape的内容是安全的 ?? HttpResponse不返回动态内容
  • 12. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! CSRF ?? 在django中默认加?入了CSRF中间件 django.middleware.csrf.CsrfViewMiddleware ?? 在post表单中添加csrf_token,<form action="." method="post">{% csrf_token %} ?? 在相应的view函数中,引?入csrf或者加上csrf_protect装饰 器
  • 13. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 代码注?入 ?? 原因:eval和pickle.loads等接?口未过滤参数造成的 ?? 错误?示例: ?? 利?用:
  • 14. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 代码注?入 pickle.loads利?用代码:
  • 15. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 严格验证参数,?非法字符直接返回 ?? 使?用ast.literal_eval() ?? 推荐使?用json格式
  • 16. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 路径穿越 ?? 原因:路径参数可控导致任意?文件下载,删除,写?入,覆 盖 ?? 错误?示例:
  • 17. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 严格验证参数范围,?非法字符直接返回 ?? 过滤..和.字符 ?? ?示例:django.views.static?示范代码
  • 18. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 任意?文件上传 (1)只在js端判断,未在后端验证 (2)未限定后缀,或者后缀?黑名单,导致恶意?文件上传 (3)未给?文件重命名,导致上传?文件名可猜测 (4)未限定?大?小,导致dos
  • 19. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! XXE ?? XXE:XML外部实体攻击(XML External Entity),通过xml 外部实体获取服务器中的数据 ?? 原因:libxml2.9以下默认导?入外部实体,lxml中默认采?用 XMLParser 注意两个关键参数,resolve_entities=True会导致解 析外部实体,no_network=True则限制不能将数据导 出到外部,会导致?一些ssrf问题。 ?? Xml.dom.minidom,xml.etree.ElementTree不受影响
  • 20. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! XXE 错误?示例:
  • 21. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 升级libxml为2.9或者以上 ?? 使?用XMLParser的过程中设置resolve_entities=False
  • 22. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! SSRF ?? SSRF(Server-Side Request Forgery:服务器端请求伪造), 是由攻击者从服务端发起请求的漏洞 ?? 成因:服务端提供了从其他服务器应?用获取数据的功能 且没有对??目标地址做过滤与限制 ?? ?示例:
  • 23. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 ?? 严格限定请求的协议,仅仅允许http和https ?? 过滤返回信息,验证远程服务器对请求的响应 ?? 限制请求的端?口为http常?用端?口
  • 24. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 不安全的封装 ?? eval封装不彻底,仅将__builtings__置为 空 ?? 原理:
  • 25. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 对策 尽量使?用owasp推荐的api接?口 封装全?面,过滤严格
  • 26. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! ?自动审计 ?? 语法树:利?用python的静态分析模块ast ?? 基本原理:危险函数+可控参数 ?? 过程: (1)递归遍历语法树,分析每个函数执?行的语句,得到可控参数列表 (2)判断执?行的语句是否有危险函数 (3)如果有危险函数,分析其参数是否在可控列表之中 (4)符合这两个条件则认为是新的危险函数
  • 27. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! ?自动审计 如何得到可控参数?
  • 28. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 演化过程 ?? 从ast到pysonar2 ?? 处理类及__init__函数 ?? 处理import语句 ?? 处理安全函数 ?? 判断语句中含危险函数 ?? 增加对os.remove类似识别不仅仅是 remove
  • 29. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! 踩过的坑 ?? 从ast到pysonar2 ?? 对python语法结构了解不全,导致分析语 法树考虑不周 ?? 递归处理参数查找
  • 30. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic! Q&A shengqi158@163.com https://github.com/shengqi158/pyvulhunter
  • 31. 北京/上海/??广州 0xFF Life's pathetic, go Pythonic!