还在愁SQL注入?这几种“姿势”让你轻松拿下!
还在愁SQL注入?这几种“姿势”让你轻松拿下!
0x00 开胃小菜
各位观众老爷们,节后第一天,咱们也别搞虚的,直接上硬菜!SQL注入这玩意儿,在网络安全界那可是响当当的人物,攻击力爆表,堪比核武器级别的存在。当然,现在WAF(Web应用防火墙)遍地走,各种安全框架层层设防,想搞一次SQL注入,难度系数堪比登月。但是!别灰心,如果你发现某个网站竟然允许你通过前端传递自定义字段来排序数据,嘿嘿,那可就有好戏看了,SQL注入的曙光可能就在眼前! 就像下面这种骚气的请求:
demo.com/order/list?name=xxxx&page=1&size=20&orderBy=createdAt
为啥这么说?因为我们要扒一扒服务端那颗躁动的心,看看它是如何把一个简单的HTTP请求,变成一段让数据库瑟瑟发抖的SQL语句的。
友情提示:以下内容以
MySQL数据库为例,没办法,谁让它是互联网公司最宠幸的数据库呢!
0x01 参数变形记
一般来说,像查询列表这种操作,前端传过来的参数通常分为两类:查询条件和分页参数。对应到上面的例子,key=xxx就是查询条件,决定了我们要用什么姿势来过滤数据;而page=1&size=20就是分页参数,决定了我们要一次性抓多少条数据。把它们翻译成SQL,大概是这个样子:
SELECT * FROM t_user WHERE name = 'xxxxx' limit 0, 20
这条SQL的意思是:查询用户表中名字等于’xxxxx’的用户,并且返回第0到20条数据。
问题来了,查询条件和分页参数都是前端小老弟传过来的变量,那我们的SQL也得跟着变才行啊!在那个互联网还是拨号上网的年代,程序员大叔们可能会直接用字符串拼接大法,像这样:
var sql = "SELECT * FROM t_user WHERE name = '" + ${name} + "' limit " + ${(page - 1) * size} + "," + ${size}
这代码,简直就是漏洞百出的典范!稍微有点安全意识的黑客,都能把name参数改成 ' or 1=1--,瞬间让SQL变成这样:
SELECT * FROM t_user WHERE name = '' or 1=1 --' limit 0,20
这一下,整个用户表都暴露了!不过,这种原始的操作方式早就被时代淘汰了。现在稍微正规点的公司,都会用SQL预编译来保护自己。
0x02 SQL预编译:给SQL穿上防弹衣
啥是SQL预编译?说白了,就是先把SQL语句的骨架(带占位符的SQL模板)扔给数据库,然后把参数单独扔过去。这样一来,数据库在编译SQL的时候,就只会按照骨架来编译,等到真正要执行的时候,才把参数填进去。这样就避免了参数篡改SQL结构,也就告别了注入风险。
想深入了解预编译?建议去研究一下MySQL的执行流程,你会发现预编译最初是为了提升性能而生的。
还是上面的例子,用预编译来表达就是:
SELECT * FROM t_user WHERE name = ? limit ?, ?
在执行的时候,我们分别把预编译SQL和参数列表传递给MySQL,就像这样:
execute(sql, name, page, size);
0x03 ORDER BY: 隐藏的危机
现在,重点来了!为啥说排序字段可能会有注入点呢?因为加上排序字段后,SQL会变成这样:
SELECT * FROM t_user WHERE name = 'xxxxx' limit 0, 20 order by createdAt
但是MySQL有个硬性规定:预编译中的参数标记只能用于数据值,不能用于SQL关键字、标识符等。
也就是说,order by后面的表字段是没办法用预编译来保护的!
这时候,程序员可能又会祭出字符串拼接大法,像这样:
var sql = "SELECT * FROM t_user WHERE name = ? limit ?, ? order by " + ${orderBy}
不管你用的是什么框架,Java系的Mybatis也好,只要是用
${}代替#{},本质上都是字符串拼接,都是在预编译的边缘疯狂试探。
如果开发小哥不够谨慎,直接把前端传回来的字符串拼接到SQL里,那恭喜你,SQL注入点找到了!
当然,如果开发小哥足够机智,在任何没有使用预编译占位符的地方,都会使用白名单机制进行严格过滤,只允许传入白名单里的orderBy属性,那你就只能含泪说拜拜了。
0x04 总结:
所以,为啥允许自定义排序的接口更容易出现SQL注入?因为这部分代码更考验开发者的经验和安全意识,稍有不慎就会留下漏洞。 各位小伙伴们,看完这篇文章,有没有觉得涨姿势了呢? 既然我这么努力的在节后第一天给大家带来干货,点个赞、留个言、给个关注,支持一下不过分吧!
学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
第三种就是去找培训。

接下来,我会教你零基础入门快速入门上手网络安全。
网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。
第一阶段:基础准备 4周~6周
这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇

第二阶段:web渗透
学习基础 时间:1周 ~ 2周:
① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。

配置渗透环境 时间:3周 ~ 4周:
① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。
渗透实战操作 时间:约6周:
① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权

以上就是入门阶段
第三阶段:进阶
已经入门并且找到工作之后又该怎么进阶?详情看下图

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

更多推荐



所有评论(0)