SQL注入

SQL注入,就是利用现有Web应用程序,构建非凡的参数输出,将(歹意的)SQL语句注入到后盾数据库引擎,最终达到坑骗服务器执行歹意SQL语句的目标。

分类

依据注入点地位的不同,可分为列注入、表注入、order注入、limit注入、group by注入等。

依据注入模式的不同,可分为数字型注入、字符型注入、搜寻型注入。

依据申请形式的不同,可分为GET型注入、POST型注入、HEADER型注入。

危害:脱库,导致敏感数据透露; getshell,获取服务器权限。
进攻:对用户输出的参数作好预编译解决,不能预编译的,可采取平安过滤,类型判断,映射等形式进行解决。

备注

  • 纯盲注
  • order注入
  • limit注入
  • 宽字节注入
  • 二次注入
  • 简略注入绕过
  • 注入拿shell

罕用函数

substring() substr() mid()ascii() if() case when() sleep()updatexml() extractvalue() floor() concat() concat_ws()user() database()procedure analyse()

SQL注入自动化利用工具

  • sqlmap 下载地址:https://github.com/sqlmapproject/sqlmap 应用教程:https://www.tr0y.wang/2018/03/21/sqlmap-guide/

参考资料

  1. https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/
  2. https://github.com/wizardforcel/mst-sec-lecture-notes/blob/master/%E6%BC%8F%E6%B4%9E%E7%AF%87%20SQL%E6%B3%A8%E5%85%A5.md
  3. https://b1ngz.github.io/java-sql-injection-note/
  4. http://sqlwiki.radare.cn/

python平安开发

工夫函数平安应用

astime

asctime()函数是将一个tuple或者是struct_time示意的工夫模式转换成相似于Sun Jun 20 23:21:05 1993的模式,对time.struct_time(tm_year=2015, tm_mon=11, tm_mday=7, tm_hour=20, tm_min=58, tm_sec=57, tm_wday=5, tm_yday=311, tm_isdst=0)中每一个键值设置invalid_time可造成溢出谬误。

在Python 2.6.x中报错为

OverflowError: long int too large to convert to int 

在Python 2.7.x中报错为

OverflowError: Python int too large to convert to C longOverflowError: signed integer is greater than maximum

因而开发过程中须要思考工夫日期的格局,避免溢出导致信息泄露!

gmtime

time.gmtime()为将秒数转化为struct_time格局,它会基于time_t平台进行测验,如上代码中将秒数扩充进行测试时会产生报错ValueError: timestamp out of range for platform time_t。如果数值在-2^63到-2^56之间或者2^55到2^62之间又会引发另一种报错ValueError: (84, 'Value too large to be stored in data type')

Utime

os.utime(path, times)是设置对应文件的access和modified工夫,工夫以(atime, mtime)元组的模式传入,代码中将modified time设置过大也会产生报错。

在Python 2.6.x中报错为

OverflowError: long int too large to convert to int

在Python 2.7.x, Python 3.1中报错为

OverflowError: Python int too large to convert to C long

如果咱们将其中的modified time设置为2^55,ls后会有:

$ ls -la temp.bin-rw-r--r-- 1 user01 user01 5 13 Jun 1141709097 temp.bin $ stat temp.binA:"Oct 10 16:31:45 2015"M:"Jun 13 01:26:08 1141709097"C:    ”Oct 10 16:31:42 2015"

在某些操作系统上如果咱们将值设为2^56,将会有以下输入(也有造成零碎解体和数据失落的危险):

$ ls -la temp.binSegmentation fault: 11$ stat temp.binA:"Oct 10 16:32:50 2015"M:"Dec 31 19:00:00 1969"C:"Oct 10 16:32:50 2015

Modules通常没有对有效输出进行查看或者测试。例如,对于64位的操作系统,最大数能够达到2^63-1,然而在不同的状况下应用数值会造成不同的谬误,任何超出无效边界的数字都会造成溢出,所以要对无效的数据进行测验。

计数函数平安

ctypes

问题在于:ctypes对内存大小没有限度,也没有对溢出进行查看.
所以,在32位和64位操作系统上都能够造成溢出,解决方案就是也要对数据的有效性和溢出进行查看。

xrange

xrange应用Plain Integer Objects而无奈承受任意长度的对象。解决办法就是应用Python的long integer object,这样就能够应用任意长度的数字了,限度条件则变为操作系统内存的大小了。

len

因为len()函数没有对对象的长度进行查看,也没有应用python int objects(应用了就会没有限度),当对象可能蕴含一个“.length”属性的时候,就有可能造成溢出谬误。解决办法同样也是应用python int objects。

Decimal

将Decimal实例和浮点值进行比拟,在不同Python版本中如果无奈比拟则用except捕捉异样,输入状况为:

在Python 2.6.5, 2.7.4, 2.7.10中输入ERROR: FLOAT seems comparable with DECIMAL (WRONG)

在Python 3.1.2中输入OK: FLOAT is NOT comparable with DECIMAL (CORRECT)

Type Comparsion

将字符串和浮点值进行比拟,在不同Python版本中如果无奈比拟则用except捕捉异样,输入状况为:

在Python 2.6.5, 2.7.4, 2.7.10中输入ERROR: FLOAT seems comparable with STRING (WRONG)

在Python 3.1.2中输入OK: FLOAT is NOT comparable with STRING (CORRECT)

在应用同一种类型的对象进行比拟之后,Python内置的比拟函数就不会进行测验。但在以上两个代码例子当中Python并不知道该如何把STRING和FLOAT进行比拟,就会间接返回一个FALSE而不是产生一个Error。同样的问题也产生于在将DECIMAL和FLOATS时。解决方案就是应用强类型(strong type)检测和数据验证。

字符串函数平安

eval

应用__import__导入os,

再联合eval()就能够执行命令了。只有用户加载了解释器就能够没有限度地执行任何命令。

codecs

以上的代码将x41xF5x42x43xF4以二进制的模式写入文件,再别离用codecs和io模块进行读取,编码模式为utf-8,对xF5和xF4不能编码的设置errors='replace',编码成为\ufffd,最初后果如下:

Correct-String —> "u'A\ufffdBC\ufffd'"

CODECS-String —> "u'A\ufffdBC'" (WRONG)

IO-String —> "u'A\ufffdBC\ufffd'" (OK)

当codecs在读取x41xF5x42x43xF4这个字符串的时候,它冀望接管到蕴含4个字节的序列,而且因为在读入xF4的时候它还会再期待其余3个字节,而没有进行编码,后果就是失去的字符串有一段被删除了。更好且平安的办法就是应用os模块,读取整个数据流,而后进行解码解决。解决方案就是应用io模块或者对字符串进行辨认和确认来检测畸形字符。

os

在不同的平台上,环境变量名的名称和语法都是基于不同的规定。但Python并不恪守同样的逻辑,它尽量应用一种广泛的接口来兼容大多数的操作系统。这种器重兼容性大于平安的抉择,使得用于环境变量的逻辑存在缺点。
解决方案是对基础设施和操作系统进行检测,检测和环境变量相干的键值对,阻止一些对操作系统为空或者有效键值对的应用。

文件函数平安

pickle

结构歹意序列化字符串,以二进制的模式写入文件中,应用pickle.load()函数加载进行反序列化,还原出原始python对象,从而应用os的system()函数来执行命令"ls -la /"。因为pickle这样不平安的设计,就能够借此来执行命令了。

cPickle

依据应用的Python版本不同,pickle或cPickle要么保留截断的数据而没有谬误要么就会保留限度为32bit的局部。而且依据Python在操作系统上装置时编译的状况,它会返回在申请随机数据大小上的谬误,或者是报告有效参数的OS谬误

解决方案就是执行弱小的数据检测来确保不会执行危险行为,还有即便在64位的操作系统上也要限度数据到32位大小。

File Open

在Python2中没有蕴含原子操作,外围库是在应用缓存进行读写。所以应该尽量去应用io模块。

协定函数平安

httplib

结构了一个HTTP服务端,如果一个客户端连贯进来,再去敞开服务端,Python将不会开释资源,操作系统也不会开释socket,引发报错为socket.error: [Errno 48] Address already in use!
解决方案就是每一个协定库都应该由这样的库封装:为每一个OS和协定都适当地建设和撤销通信,并开释资源

poplib

以上代码当中,首先开启一个虚构的服务端,应用客户端去连贯服务端,而后服务端开始发送空字符,客户端持续性接管空字符,最初到客户端内存填满,零碎解体,解决方案就是如果无法控制检查数据的类型和大小,就应用Python > 2.7.9'或者'Python > 3.3'的版本

urllib

urllib2并没有适合的逻辑来解决数据流而且每次都会失败,将上次代码运行三次都会失去谬误的文件大小的输入

不平安的库

astbastioncommandscookiecpickle/pickleevalmarshalmktempmultiprocessingos.execos.popenos.spawnos.systemparserpipesptyrexecshelvesubprocesstarfileurllib2urlparseyamlzipfile

API平安设计指南:http://blog.nsfocus.net/rest-api-design-safety/

nodejs

1、sql注入

sql注入产生的起因是开发人员在进行数据库操作是,未针对用户的输出进行过滤和预编译解决,从而导致攻击者能够管制数据库查询语言而进行非法操作,如下所示:

var query = "SELECT name FROM Users WHERE login='" + req.body.login + "'"; db.sequelize.query(query,{ model: db.User }).then(user => { if(user.length){ 

修复计划,针对参数进行预编译解决

if (vh.vCode(req.body.login)){ db.User.find({where:{'login':req.body.login}}).then(user => { if (user) { 

2、命令注入

命令注入产生的起因是开发人员在调用系统命令是,采纳危险的系统命令执行函数,并且过于信赖系统命令传递的参数,导致攻击者能够通过管道命令拼接的形式去执行任意系统命令,如下所示:

const exec = require('child\_process').exec; ... exec('ping -c 2 '+ req.body.address, function(err,stdout,stderr){ console.log(err) output = stdout + stderr 

修复计划,采纳平安的系统命令调用函数,并且针对用户输出进行严格的校验

const execFile = require('child\_process').execFile; ... if (vh.vIP(req.body.address)){ execFile('ping', \['-c', '2', req.body.address\] , function(err,stdout,stderr){ output = stdout + stderr 

3、暴力破解

暴力破解攻打次要产生在登陆业务模块中,因为零碎针对用户登陆生效性不足校验,导致攻击者能够通过主动的形式破解零碎的口令,从而获取零碎敏感数据 修复倡议:针对用户登陆接口减少避免暴力破解的形式,如生物辨认、并减少账号或者IP锁定机制

4、敏感信息泄露

敏感信息泄露在应用NodeJS开发中个别存在于无认证拜访接口、日志记录的业务场景外面,如下所示:

db.User.findAll({}).then(users => { res.status(200).json({ success: true, users: users }) 

修复倡议:针对用户敏感数据进行脱敏解决,或者禁止接口返回记录用户敏感数据信息

db.User.findAll({attributes: \[ 'id' ,'name', 'email'\]},).then(users => { res.status(200).json({ success: true, users: users })

5、XML实体注入

xml实体注入次要存在于应用xml实体解析的业务性能接口时,未对实体解析的内容进行过滤和校验,导致攻击者能够在xml实体中主任歹意的命令,从而获取零碎的敏感数据或者权限,如下所示:

module.exports.bulkProducts = function(req, res) { if (req.files.products & req.files.products.mimetype=='text/xml'){ var products = libxmljs.parseXmlString(req.files.products.data.toString('utf8'), {noent:true,noblanks:true}) 

修复计划,非业务必须倡议禁用xml实体解析性能

module.exports.bulkProducts = function(req, res) { if (req.files.products & req.files.products.mimetype=='text/xml'){ var products = libxmljs.parseXmlString(req.files.products.data.toString('utf8'), {noent:false,noblanks:true}) 

6、xss注入

xss注入次要的产生的起因是因为开发人员针对用户输出过于信赖,导致用户能够任意写入js语言输入到页面上,从而导致js代码执行,获取用户敏感的cookie数据信息。

<td><%- output.products[i].id %></td><td><%- output.products[i].name %></td><td><%- output.products[i].code %></td><td><%- output.products[i].tags %></td>

修复计划:xss修复计划的八字准则,输出过滤、输入编码

<td><%= output.products[i].id %></td><td><%= output.products[i].name %></td><td><%= output.products[i].code %></td><td><%= output.products[i].tags %></td>

7、不平安的反序列化

在应用NodeJS开发的场景中,如果在序列化和发序列化操作的过程中,未对反序列话生成的对象进行校验,会导致近程命令执行 如下所示:

module.exports.bulkProductsLegacy = function (req,res){ // TODO: Deprecate this soon if(req.files.products){ var products = serialize.unserialize(req.files.products.data.toString('utf8')) 

修复计划: 针对反序列化产生的对象进行严格的校验,避免歹意的代码生产

module.exports.bulkProductsLegacy = function (req,res){ // TODO: Deprecate this soon if(req.files.products){ var products = JSON.parse(req.files.products.data.toString('utf8')) 

8、不平安的访问控制

不平安的访问控制个别存在于利用接口的未受权拜访导致泄露零碎敏感信息,如swagger-ui, spring-acutotar等业务场景,在应用Nodejs开发的利用零碎中,同样须要留神应用平安的访问控制,避免信息泄露,如下所示

... router.get('/admin',authHandler.isAuthenticated,function(req,res){ res.render('app/admin',{admin: (req.user.role=='admin')}) })router.get('/admin/api/users',authHandler.isAuthenticated, appHandler.listUsersAPI) ...

修复计划: 针对对外开发的接口减少强身份验证机制,避免未受权拜访导致的信息泄露

... var isAdmin = false; if(!isAdmin){ var div = document.getElementById('admin-body'); div.style.display = "none"; }else{ var div = document.getElementById('non-admin-body'); div.style.display = "none";  } ...

9、应用不平安的第三方库

软件过程中通常会应用开发第三方组件来晋升编码效率,缩小反复造轮子,然而随着不平安的第三方组件引入会对利用零碎带来新的平安威逼,因而在NodeJS开发过程中,应用的第三方组件须要进行严格的平安审核和扫描,避免引入存在平安危险的组件库 如mathjs

修复倡议: 1、应用平安的组件库替换 2、针对用户的输出进行合法性校验

10、平安配置缺失

在应用NodejS开发利用过程中,为了不便定位问题,存在生产环境中开启debug模式的业务场景,在该模式下,会存在信息泄露的平安危险,导致攻击者能够很轻易的获取零碎的敏感信息,如下所示:

... if(req.body.eqn){ req.flash('result',mathjs.eval(req.body.eqn)) res.render('app/calc') ... 修复计划: 生产环境禁止开启debug模式,同时针对利用零碎接口的报错信息对立解决 try{ result = mathjs.eval(req.body.eqn) }catch (err){ result = 'Invalid Equation' }

环境阐明

DVNA是一个采纳纯NodeJS编写的web利用靶场,针对owasp top10类型的破绽都有相干的破绽测试验证,学员能够通过靶场的实际操作,真正意义上的了解和把握NodeJS平安开发标准;

参考资料

1、https://github.com/appsecco/dvna 2、NodeJS平安开发标准:参考附件 3、NodeJS开发文档:http://nodejs.cn/api/

iOS平安开发

APP开发时须要留神,用户的敏感信息个别准则是尽量加密保留在服务器上,特地是明码须要应用Hash加salt的办法,并且传输的时候须要应用HTTPS加密传输,业务所需,切实要保留在本地的敏感信息,须要加密保留在本地,另外保留在Keychain中的数据也须要加密;

加密算法须要应用平安的加密算法:平安的对称加密算法包含:AES128、AES192、AES256以及国密SM1;平安的非对称加密算法包含:RAS2048、ECC256、SM2(特地留神位数肯定要够,RSA至多是2048位);平安的Hash包含SHA2(SHA224、SHA256等)、SHA3、SM3。不平安的加密算法禁止应用包含:不平安的对称加密算法:DES、3DES;不平安Hash函数:MD5、SHA1。

上线的APP要敞开日志;对于金融类APP来说,最好自定义键盘;当在有敏感信息的页面进入后盾后,须要模糊化页面解决;对于企业外部应用的APP,如果须要许禁止复制和粘贴利用内的数据到内部。
Keychain的平安属性kSecAttrAccessibleAlways、kSecAttrAccessibleAlwaysThisDeviceOnly不倡议应用,倡议应用kSecAttrAccessibleWhenUnlockedThisSDeviceOnly。

代码中禁止硬编码用户明码等敏感信息以及硬编码用户的密钥信息。

URL Scheme和WebView平安

因为UIWebView默认开启WebKitAllowFileAccessFromURLs等,存在File逾越破绽,禁止应用UIWebView, 举荐应用WKWebView。

当应用URL Scheme唤起利用时,只容许白名单内的APP通过URL Scheme唤起利用。

iOS加固平安

iOS APP上线前能够进行加固解决,能够应用商业工具,也能够本人进行解决,包含对字符串混同、类名办法混同、程序代码逻辑混同和退出平安的SDK用于越狱检测、调试检测、注入检测。

Xcode和第三方库平安

应用的Xcode和第三方库,最好到官网下载,应用前须要查问是否有cve破绽。

参考文献
  1. 《iOS Hacking Guide》
  2. 《黑客攻防技术宝典:iOS实战篇》
  3. http://damnvulnerableiosapp.com

iOS 重签名
iOS逆向之 framework 注入

web

ssrf

  • SSRF(Server-Side Request Forgery),服务器申请伪造,是指利用能够发动网络申请的内部利用和服务当作跳板来攻打外部其余利用和服务的一种攻击方式。
  • 该破绽为服务器发动网络申请从近程获取资源,申请的指标地址和协定用户可控并且服务端并未做钻研校验导致,常见于社交分享、图片下载等性能。
  • 常见的可能触发该破绽的函数包含PHP中的file_get_content、fsockopen、curl_exec等。
  • 通常能够通过SSRF探测内网利用,读取文件,甚至是作为跳板攻打内网利用,如应用gopher协定利用内网redis写入文件getshell。
  • 个别通过校验参数url等形式进行进攻,然而不充沛的校验能够通过奇妙地结构url等形式绕过。

xss

类型存储区域插入点
反射型URLHTML
存储型后端数据库HTML
DOM型数据库/前端存储/URL前端Javascript
  • 常见输出点

    • 输入到HTML标签中
    • 输入到HTML标签属性值中
    • 生产HTML标签事件
    • 输入到DOM中
    • 其余

注意: 1、内部元素(svg, math)标签中能进行html解码 2、RCDATA元素标签(textarea, title)下不能创立新标签,不能执行脚本

  • 对于编码解码

    • HTML实体编码:10进制/16进制 在html解析时能被解码应用 实体名称: &lt; &gt; 实体编号(10进制): &amp;#60; &amp;#62; 实体编号(16进制):&amp;#x3c; &amp;#x3e;
    • Javascript编码:javascript8进制编码,16进制编码,Jsunicode编码 在javascript中能被解码应用 10进制:\74\76 16进制: \x3c\x3e
    • Unicode: \u003c \u003e URL编码:应用javascript伪协定的标签属性下,可应用base64编码 在URL中能被解码应用 【协定://】这些不能编码
  • 防护绕过的个别办法: 详见ppt
  • 防护倡议:

    • 利用模板引擎 模板引擎个别自带本义,需尽量放弃最新,防止低版本破绽
    • 防止内联事件 尽量不要用onLoad=“onload(‘{{data}}’)” onClick=“go(‘{{action}}’)” 这种写法
    • 防止拼接 HTML 应用成熟的渲染框架,并放弃新版本+后端过滤,如vue,angular等 应用成熟的过滤器,并放弃新版本,如ESAPI,Dompurify等
    • 减少攻打难度,升高攻打结果 严格白名单、标准的CSP、限度长度、http-only等

csrf

所谓CSRF破绽,就是通过浏览器的cookie机制,通过诱骗用户点击蕴含歹意Javascript代码的HTML页面,在用户不知情的状况下,触发对要害接口的调用。

CSRF破绽的利用前提是:

  • 用户已登录网站
  • 网站的要害API接口没有对CSRF做进攻
  • 用户点击拜访了攻击者的网页

CSRF破绽的利用形式是:

  • GET申请:img标签src=属性;
  • POST申请:form表单,配合Javascript代码主动提交表单

CSRF破绽的检测形式是:

  • 查看申请中是否蕴含随机token内容
  • 批改token,查看接口的返回后果
  • 批改HTTP头中的Referer字段,查看接口的返回后果

CSRF破绽的进攻伎俩有:

  • 基于白名单,查看Referer的内容
  • 增加CSRF token(倡议)
  • 图形/短信验证码

xxe

XXE破绽原理

XML指可扩大标记语言(Extensible Markup Language),次要用来传输 数据。 XML从1995年开始有其雏形,在 1998 年 2 月 10 日成为W3C的标 准(XML1.0)。

DTD(Document Type Definition):文档类型定义,用于定义XML文档的合 法构建模块,应用一系列非法的元素来定义文档的构造,对XML文档元素进 行束缚和验证。DTD 可被成行地申明于 XML 文档中,也可作为一个内部援用。

XXE破绽正是借助DTD施行攻打。XXE破绽的根本原因是对非平安的内部实体数据进行解析解决导致的平安问题。 常见编程语言如PHP、JAVA、Python、.NET等使用不当均可能存在XXE破绽。 2. XXE破绽利用

不同编程语言可应用不同协定进行攻打。

XXE破绽的危害

近程文件读取
命令执行(PHP expect)
内网端口扫描
攻打内网网站
dos攻打
XXE破绽的进攻
禁用内部实体

参考文献

http://oxmlxxe.github.io/
https://github.com/JoyChou93/...
https://github.com/swisskyrep... Injection

JAVA

数据校验

防止间接应用不可信数据来拼接SQL语句

防止间接应用不可信数据来拼接XML

防止间接应用不可信数据来记录日志

防止向Runtimeexec() 办法传递不可信、未污染的数据

避免用户输出未通过验证间接输入到html界面

I/O操作

及时删除应用结束的临时文件

在多用户零碎中创立文件时指定适合的拜访许可

限定上传文件的格局和大小

序列化和反序列化

敏感数据的加密和签名

禁止序列化未加密的敏感数据

避免序列化和反序列化被利用来绕过平安治理

运行环境

将所有平安敏感代码都放在一个jar包中,签名再加密

生产代码防止蕴含任何调试入口点

其余

禁止在日志中保留敏感数据

平安加密算法

增加盐值(salt)

禁止硬编码敏感信息

应用强随机数

fastjson
2017年3月15日,FastJson官网公布平安布告示意fastjson在1.2.24及之前版本存在近程代码执行高危安全漏洞。破绽产生的起因是因为fastjson反序列化Json字符串为Java对象时autoType没有做正确的检测解决,反对应用autoType来实例化任意类。

参考资料

  1. Fred Long, Dhruv Mohindra, Robert C. Seacord, Dean F. Sutherland, David Svoboda. The CERT Oracle Secure Coding Standard for Java. Addison-Wesley Professional, 2011
  2. Secure Coding Guidelines for the Java Programming Language. http://www.oracle.com/technet...
  3. CWE&SANS TOP 25, http://www.sans.org/top25-sof...
  4. OWASP Guide Project, https://www.owasp.org/index.p...

文件上传

  • js查看
  • 上传非凡后缀
  • .htaccess绕过
  • Windows个性(点号、空格、::$DATA)
  • 后缀大小写绕过
  • 双后缀绕过
  • 解析破绽
  • MIME绕过
  • 截断绕过
  • 文件头查看
  • Getimagesize绕过
  • exif_imagetype绕过
  • 图片二次渲染绕过
  • 条件竞争、数组绕过
  • apache解析破绽
  • IIS解析破绽
  • PUt办法
  • 绕过waf等等

Android

Xposed__Hook根底入门教程

https://repo.xposed.info/module/mobi.acpm.sslunpinning

Android整体加固次要是将apk中的dex进行加密保留,同时将原App的入口改成壳程序;由壳程序对加密dex的解密, 并且实现自定义的DexClassLoader对解密后dex的加载,和运行环境的调整批改,之后进入原dex的代码流程; 因为在dex的加载过程中会调用到dexopt进行dex的优化,从而对dvmDexFileOpenPartial、dexFileParse等进行下断点 即可dump出解密后的dex,实现脱壳;
IDA 调试 Android 办法及简略的脱壳实现