简单的sql注入攻击:网络安全干货SQL注入攻击思路手法总结
简单的sql注入攻击:网络安全干货SQL注入攻击思路手法总结SQL注入的注入点与脚本语言关系不大,只和数据库类型相关。就拿php站点和java站点来说,php站点会爆出更多的漏洞,因为java中存在预编译机制,所以相较来说sql注入更少,这是语言特性决定的。但是语言特性和数据库没有强关联,在漏洞通报中出现SQL注入,不会通报用何种语言编写,只会出现是何种数据库。其实“注入”这个行为,也是一种对数据库的操作。这个行为的对敏感信息造成泄漏,所以判定成恶意地“注入”,实际上与用户的普通操作别无二致,在开发过程中,应该对用户的“操作”进行过滤和规范,尽量减少SQL注入的出现。1.传入参数可控,使用者可以对传入数据库的参数变量进行操作。2.应用过滤不当,前端或者web应用、框架等未对使用者做好隐藏执行语句和传入参数的严格过滤。SQL注入的关联性
一、前言本文为自己对SQL注入这个攻击手法的理解,跟大家一起分享SQL注入知识。
分上下篇,上篇为攻击手法概括,初稿不会写太多,后面会更新;下篇为防御篇,会把一些常见的,不常见地写进去。
二、概念SQL注入漏洞之所以会出现就是开发人员针对代码编写开发web应用程序过程中,未对使用者输入的可控参数的合法性进行有效判断和过滤。从而造成被别有用心之人,利用“参数可控”特性将恶意参数带入数据库中执行,造成了恶意的SQL语句对数据库执行行为。
归结出两个条件,引起SQL注入:
1.传入参数可控,使用者可以对传入数据库的参数变量进行操作。
2.应用过滤不当,前端或者web应用、框架等未对使用者做好隐藏执行语句和传入参数的严格过滤。
SQL注入的关联性
其实“注入”这个行为,也是一种对数据库的操作。这个行为的对敏感信息造成泄漏,所以判定成恶意地“注入”,实际上与用户的普通操作别无二致,在开发过程中,应该对用户的“操作”进行过滤和规范,尽量减少SQL注入的出现。
SQL注入的注入点与脚本语言关系不大,只和数据库类型相关。就拿php站点和java站点来说,php站点会爆出更多的漏洞,因为java中存在预编译机制,所以相较来说sql注入更少,这是语言特性决定的。但是语言特性和数据库没有强关联,在漏洞通报中出现SQL注入,不会通报用何种语言编写,只会出现是何种数据库。
所以SQL注入只和数据库类型有关系,脚本语言只是发现注入点的一个门户。
三、注入思路这里给大家分享一些学习资料及思路大纲可【点击查看】
测试方式
黑盒测试:url、回显、报错、延时、布尔状态等等
白盒测试:代码审计
攻击方式选取
参数类型>>【闭合方式】
数据库类型>>【payload的选择和语句组合】
提交方式>>【传参的方式可以绕过某些防护设备】
数据查询方式>>【是否有回显,回显点;延时注入的模糊判断;二次注入的数据呈现;工具有时候无法对所有数据捕获】
传输时加密>>【要提交对方可以识别的参数】
注入权限>>【拿到的权限是否可以造成威胁、扩大威胁】
攻击方式的选取应该存在多角度,但是一定离不开脚本语言、数据库类型和数据传输。
注入危害
单个数据库拿权>>【考虑低权限提权,查看是否存在可利用函数和扩展】
多个数据库拿权>>【尝试寻找信息泄露多角度提权,尝试使用高级函数、跨库提权】
后台数据泄露>>【寻找、构筑路由,寻找管理员账号、历史配置文件等】
web权限丢失>>【尝试对网站功能点测试】
服务器权限丢失>>【进行横移;站库分离时,从数据库拿到宿主服务器的权限;根据当前数据库类型和服务器的安全性决定】
点到面突破,数据库中可以包含许多信息,这已经不是单纯SQL注入,可以发展到其他攻击面进行渗透。
特点注入
语言只决定SQL注入产生概率>>【确定网站使用的语言,根据不同的语言特性进行注入,提高效率】
数据库类型决定SQL注入的过程>>【每种数据的语句存在差异,这样的差异决定注入的思路】
SQL注入需要人工配合>>【工具存在一定的局限性,部分工具对于数据回传没有判定从而忽略注入点】
存在防护设备下注入>>【判定防护设备,可以尝试“旧瓶装新酒”对旧思路加工再注入;分块、编码、、垃圾数据、带外、中间等注入】
有目的去注入,才会使攻击效率提高。SQL注入通过多维度确定对方信息,能有效选取payload和思路。
四、常见注入方式1.盲注
所谓盲注,就是我们在注入过程中,无法获得直接的回显或者有效信息去判断注入点是否存在,需要借助一些方法去进行验证和获取返回的数据。
1.布尔盲注:执行SQL语句后,只会存在两种结果。通过构造逻辑表达式判断数据的具体内容。
2.时间盲注:因为数据传输存在时间差,可以利用sleep()函数等,去判断构造的逻辑表达式是否成功获取数据。
3.报错盲注:通过数据库的特殊函数的报错强制使参数在报错页面输出。这种函数往往会带出其他信息,可以扩展打击面。
2.堆叠注入
利用数据库特性,进行多语句执行。
但是限制较大,受API、数据库类型、权限、网站架构等限制。一般多见于CTF比赛中,但是实际渗透中,如果存在多语句可执行,那么可以尝试,也许有意外收获。
已知支持的数据库类型有: mysql、SQL-Server、PostgreSQL。
3.二次注入
二次注入其实就是,先注入数据后再注入,等同于一次注入。攻击者先构造出特定语句存入数据库,当攻击者对存入数据或者语句进行读取时出现注入点,这就是“二次”所在。
其实是一次内鬼之战,攻击者第一次输入的数据被认为是“安全”时,存入数据库内被转移,被转移的数据默认是安全的。然后第二次输入时,调用时即使输入数据没被转移,也可能被判定成“安全”,这时造成二次注入。
4.差异化注入
注入时,需要注意数据库类型和网站架构。不同的数据库类型存在差异,利用这种差异进行注入攻击。
access数据库的偏移注入:知道表名而不知道列名时,利用“*”对其拆解,当到达一定长度时返回正常页面。
mysql数据库的结构利用:因为mysql数据库的特性,库名-表名-列名-数据层层递归,mysql5或以上存在三张特殊的表(information_schema.schemata/tables/colusmn),进行间接查询。
sqlite数据库的隐藏表利用:sqlite文件中存在一张隐藏表格 sqlite_master ,该表格记录下建表时的信息。
mongodb数据库闭合注入&数组绑定注入:mongodb是一种非关系型数据库,可以利用构造数组后使用ne(等同于>等字符)进行注入。
5.基于场景的注入
host注入:因为不同语言和开发逻辑,获取IP的方法都是不一样的。那么在数据包中有一个HOST字段,如果该字段可控,并且获取到IP地址数据被写入数据库中,那么就有机会存在HOST注入。
XFF注入:这个比较有意思,和XRIP字段一样,用于记录访问者的IP,这个字段记录“真实IP”。但是一旦这个字段被修改,返回中存在“XXIP无法访问该资源”等类似语句时,就代表可控,可控也可以搞一波。
SQL注入本质上也是一种对数据库的操作,获取我们想要的信息。