使用js在本地对文件进行校验
解决方法1:浏览器禁用js可实现绕过
解决方法2:bp抓包
将jpg改为php就可实现绕过
解决方案3:将网页下载下,删除过滤的js,在form提交表单中添加action属性,将其发送给原本应该正常发送的地址(查看请求头的URL)。这种方案可以解决一些判断文件以及提交文件都用js,从而导致无法抓包的问题
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
校验代码判断文件的type类型是否为jpg/png/gif三种格式之一
绕过方法1:先将php后缀改为jpg/png/gif三种其中之一,然后抓包改为php
绕过方法2:直接上传php文件,然后抓包修改数据包中Content-Type类型
这一关提示
查看校验代码
绕过方法1:双写::\(D::\)DATAATA
校验代码只校验一次::$DATA所以可以双写绕过
::\(DATA是window系统特有文件流,::\)DATA可以绕过对文件上传的安全检查,image.php::$DATA上传以后在服务器会存储为image.php
绕过方法2:扩展名绕过
使用php5/php4/phtml等扩展名进行绕过
注:扩展名绕过需要在phpsstudy中的http.conf增加
版本太新的phpstudy即使添加了也不能上传成功,建议使用版本较早的版本
黑名单限制增加,但没有限制.htaccess
.htaccess 是一个 Apache Web 服务器的配置文件
名字内带有jpg的文件都以php格式解析
先上传.htaccess文件,在上传shell
.user.ini是一个配置文件,用于设置PHP运行环境中的各种配置设置。
.user.ini配置 使其自动包含shell.jpg文件到每个PHP文件的开头。
auto_prepend_file=shell.jpg
shell.jpg
<?php phpinfo();?>
先上传.user.ini再上传shell.jpg
校验代码相比之前少了,转换小写,搭建平台window对大小写不敏感
绕过方法1:大小写绕过
绕过方法2:双写::$DATA
少了trim函数
直接后面添加空格进行绕过
没有使用函数deldot,在window中点和空格都是不被允许的
直接::$DATA绕过
这一关主要针对deldot函数进行绕过,deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
遇到deldot()函数可以在后缀名后加入". .",这就是点空格点绕过,空格负责将deldot()停止,然后会被trim函数删除,但是会剩下一个点,上传到服务器,点也会被删除
代码先创建一个黑名单,然后接收上传文件的后缀名,去除黑名单内的字符,但只进行了一次绕过,所以可以进行双写绕过
00截断条件:
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
服务器版本
审计代码
上传路径可控,使用get传参那就可以使用%00截断
与12关代码大同小异,唯一不同的就是传递的存储路径由get改为post
get传参会经过编码,post不会,所以使用0x00截断
截断需要在十六进制中将传递的名字后面写为00
或者直接写%00然后对其进行url编码
getReailFileType函数读取文件前两个字节判断是否为jpg,png,gif其中之一
判断上传文件是否满足要求,满足则随机命名存入文件夹
制作图片马,直接在图片后插入
文件包含漏洞,接收get传入的file参数
访问url:include.php?file=upload/4620230414113629.png
与十四关大同小异,只是换成getimagesize()来检查文件
getimagesize()函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
直接上传图片马,然后访问url:include.php?file=upload/图片命名.jpg
需要开启php_exif模块,否则会界面无法显示
exif_imagetype()函数:读取一个图像的第一个字节并检查其签名,如果发现恰当的签名返回一个对应的常量,否则返回false。返回值和getimagesize()返回值的数组中的索引2的值是一样的,但本函数快的多。
直接用之前图片马即可
代码使用imagecreatefromjpeg函数对图片进行渲染
我们可以先上传一个gif图片然后下载渲染过后的gif,二者使用010进行对比,查看有哪些地方是不会被渲染所更改的
然后在不会被渲染的地方添加phpinfo
成功上传
根据代码可以看出,先将上传文件放到目录下,然后再进行条件判断,不满足白名单则删除
可以使用burp爆破模块,进行爆破,然后再不断访问上传脚本,只要访问到,就会打断代码删除文件的操作
不断访问
本关代码有点小问题,需要修改myupload.php
代码审计可知,跟18关大致类型一致,不过限制更加严格一些,思路是相同的,在文件被上传但还未重命名的时候访问
这是可以上传的后缀名单,这样就可以使用apache未知扩展名解析漏洞,遇到无法解析的后缀就往前挪一个
上传shell.php.7z
burp爆破
不断刷新访问
代码审计可知先将文件上传然后判断传递的保存名称是否存在黑名单,不存在就将其移动到指定目录
由于代码没有对其进行严格的限制绕过,所以之前的大小写,空格,点,::$DATA均可以实现绕过,但由于之前关卡都考过,所以这肯定不是作者重点
move_uploaded_file()特性,会忽略掉文件末尾的 /.
上传后直接访问即可
代码将上传文件名分割为数组形式然后进行判断
修改为数组形式上传
在数学和统计学中,矩(moment)是对变量分布和形态特点的一组度量。本文记录相关概念。 简介在数学和统计学中,矩(moment)是对变量分布和形态特点的一组度量。n阶矩被定义为一变量的n次方与其概率密度函数(ProbabilityDensityFunction,PDF)之积的积分。在文献中n阶矩通常用符号μn表示,直接使用变量计算的矩被称为原始矩(rawmoment),移除均值后计算的矩被称为中心矩(centralmoment)。变量的一阶原始矩等价于数学期望(expectation)、二至四阶中心矩被定义为方差(variance)、偏度(skewness)和峰度(kurtosis)。随后介绍矩在数学变量、概率论、图像处理中的定义。数学变量数学上 对连续变量x和其单变量概率密度函数P(x)或积累分布函数(CumulativeDistributionFunction,CDF)C(x),其n阶矩\mu_{n}^{\prime}被定义为:\mu_{n}^{\prime}=\intx^{n}dC(x)=\intx^{n}P(x)dx若变量x为离散变量,则\mu_{1}^{\prime}也可以
大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。问题一:这标红色的符号取掉一直没有见过标红色的符号,尝试把这些符号粘贴出来到notepad发现它是乱码,尝试将它粘贴到sql查询分析器里,发现它显示空白。对于这种数据,一直想着找到这个acsi码,然后问题就迎刃而解了。结果找了一大堆的相关资料,都没有类似的问题。最后,採用直线式思维,直接索性就把那个字符粘到Sql查询分析器的窗体里,解决方式例如以下:SELECT [F0L_MID], ltrim(rtrim(REPLACE([F0L_MID],’’,’‘))) FROM[pfvaults].[dbo].[OMEGAFld]问题以然解决,哪位高手要是遇见标红的字符,还请一块出来分享,看那个究竟是什么东东筛选出FOL_MID字符串除过前后标红的特殊字符,以空格開始或者以空格结尾的结果集(注意where后的条件)SELECT [F0L_MID] FROM[pfvaults].[dbo].[OMEGAFld] where [F0L_MID]like‘%’or [F0L_MID]like‘%’发布者:全栈程序员栈长,转载请注明出
IoTClient 简体中文这是一个物联网设备通讯协议实现客户端,将包括主流PLC通信读取、ModBus协议、Bacnet协议等常用工业通讯协议。本组件基于.NETStandard2.0,可用于.Net的跨平台开发,如Windows、Linux甚至可运行于树莓派上。本组件终身开源免费,采用最宽松MIT协议,您也可以随意修改和商业使用(商业使用请做好评估和测试)。开发工具:VisualStudio2019QQ交流群:995475200使用说明引用组件Nuget安装Install-PackageIoTClient 或图形化安装 ModBusTcp读写操作(点击展开)ModBusTcp读写操作//1、实例化客户端-输入正确的IP和端口 ModBusTcpClientclient=newModBusTcpClient("127.0.0.1",502); //2、写操作-参数依次是:地址、值、站号、功能码 client.Write("4",(short)33,2,16); //2.1、【注意】写入数据的时候需要明确数据类型 client.Write(
参考链接:Java本地内部类1.为什么成员内部类可以无条件访问外部类的成员? 在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟。事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面是Outter.java的代码: publicclassOutter{ privateInnerinner=null; publicOutter(){ } publicInnergetInnerInstance(){ if(inner==null) inner=newInner(); returninner; } protectedclassInner{ publicInner(){ } }} 编译之后,出现了两个字节码文件: 反编译Outter$Inner.class文件得到下面信息: E:\Workspace\Test\bin\com\cxh\test2>javap-vOutter$InnerCompiledfrom"Out
腾讯TBS浏览器服务我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug。这时候腾讯老哥站出来了,搞了一个TBS浏览器服务这个东西。说得这么屌,其实就是一个webView控件,然后解析解析网页的内核是他自己做的,叫X5内核(系统原生的WebView用的是WebKit内核),所以我们开发者用的时候,主要就是用这个com.tencent.smtt.sdk.WebView控件当然这个控件有很多功能,当然也有些要注意的地方。官网地址:http://x5.tencent.com1.特殊功能: 速度快:相比系统webview的网页打开速度有30+%的提升;省流量:使用云端优化技术使流量节省20+%;更安全:安全问题可以在24小时内修复;更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;兼容好:无系统内核的碎片化问题,更少的兼容性问题;体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;功能全:在Html5、ES6上有更完整支持;更强大:集成强大的视频播放器,支持视频格式远多于系统webview;视频和文件格式的支持x5内核多于系统
在安装nginx,mysql,tomcat等等服务的时候,我们会遇到需要使用的端口莫名其妙被占用,下面介绍如何解决这类问题。说到端口,还不得不提到防火墙,本文还会简单介绍如何配置防火墙开发端口。Linux查看端口情况的各种方法 所有端口的映射关系在/etc/services文件中有Linux端口简单介绍,端口编号从0-65536,各编号端的用途如下:0-1023:公认端口,与常见服务绑定(FTP,SSH)1024-49151:注册端口,用于和一些服务绑定49152-65535:动态或私有端口,可用于任意网络连接端口分为TCP和UDP传输协议。Linux查看端口状态命令可以有下面的命令查看端口情况,点击命令可以调整到每个命令的使用详情:nmap命令,端口扫描使用netstat检测开发端口lsof检查端口描述符#查看绑定本机的端口 nmap127.0.0.1 #检查3306端口 netstat-anlp|grep3306 #检测3306接口 lsof-i:3306复制linux释放占用端口解决办法解决步骤如下:查找占用端口的进程杀掉该进程使用下面命令即可:#可以写成一条命令netsta
MVC中的引用缺少问题开发工具与关键技术:MVC 作者:盘洪源 撰写时间:2019年2月3日星期六复制在MVC中创建新项目的时候需要引用到数据库,在引用完数据库后有个地方很容易出错,就是有点时候引用完数据库后引用缺少2个部分,缺少那2个部分后面的内容就会一直执行不了。如下图复制有的时候引用就会少了上面者2个部分,然后后面你执行什么内容都会出错,这时候就要把这2个引用引进来,首先右键点击添加引用然后到下一个页面点击浏览,然后就找到你这个文件所在的地方 然后打开你的文件点开这个 然后找到这个文件点开 再找到这个文件点开然后再点开,然后就找到缺少那2个引用,就可以点击引入了,这个问题只是针对于缺少引用来用的,只要找到文件所在的地方找到缺少引用的部分引入进来就行了。
1.加载文本文件中的纯文本:LoadData1.mxml<?xmlversion="1.0"encoding="utf-8"?> <!--通过Bind绑定,使用了MXML的HTTPService标签,结果格式为text文本格式--> <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="vertical"creationComplete="txtLoader.send();"> <mx:Style> Application{font-size:12px;} </mx:Style> <mx:HTTPServiceid="txtLoader"url="test1.txt"resultFormat="text"/> <mx:VBox> <mx
前言作为一名前端工程师,每天的清晨,你走进公司的大门,回味着前台妹子的笑容,摘下耳机,泡上一杯茶,打开Terminal进入对应的项目目录下,然后npmrunstart/dev或者yarnstart/dev就开始了一天的工作。当你需要进行时间的转换只需要使用dayjs或者momentjs,当你需要封装http请求的时候,你可以用fetch或者axios,当你需要做数据处理的时候,你可能会用lodash或者underscore。不知道你有没有意识到,对于今天的我们而言,这些工具包让开发效率得到了巨大的提升,但是这一切是从什么开始的呢?这些就要从Modulardesign(模块化设计)说起:Modulardesign(模块化设计)在我刚接触前端的时候,经常听说Modulardesign(模块化设计)这样的术语,面试时也会经常被问到,“聊聊前端的模块化”这样的问题,或许很多人都可以说出几个熟悉的名词,甚至是他们之间的区别:•IIFE[ImmediatelyInvokedFunctionExpression]•Common.js•AMD•CMD•ES6Module但就像你阅读一个项目的源码一样,
背景前些天公司服务器数据库访问量偏高,运维人员收到告警推送,安排我团队小伙伴排查原因.我们发现原来系统定期会跑一个回归测试,该测运行的任务较多,每处理一条任务都会到数据库中取相关数据,高速地回归测试也带来了高频率的数据库读取.解决方案1我们认为每个任务要取的数据大相径庭,因此我们考虑对这个过程进行修改,加入MemoryCache把数据库中读取到的数据进行缓存.整个修改非常简单,相信对常年混迹在博客园中的各位大佬来说小菜一碟,因此小弟不再叙述添加缓存的步骤细节.从缓存的添加,代码提交,Teamcity编译通过,到测试环境,QA环境的安装无比流畅,一切显得如手到擒来.嗯,优秀是一种习惯,没有一点办法.人生如戏,当我们还沉浸在"我加的Cache不可能又BUG"的自信中时,QA传来噩耗,回归测试大量未通过....故障排查之前习惯了使用Redis缓存,因此,常识告诉我们--- 在数据库中数据没有改动的前提下,加了缓存后读取的数据的效果和从数据库中读取的效果是一模一样的.除非 ,,, 除非 这个常识是错误的....因此我们加了日志,对写入缓存前后读取出来的数据进行了对比,结果
导读:本文详细阐述人工智能领域的技术研究、产业投入、服务应用,为促进人工智能技术和产业发展提供一定的基础资料与指导。来源:智东西(ID:zhidxcom)人工智能是引领未来的战略性高科技,作为新一轮产业变革的核心驱动力,催生新技术、新产品、新产业、新模式,引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。本文中,我们推荐中国信息通信研究院的报告《2018世界人工智能产业发展深度分析报告》,作为此次大会的重要成果,它详细阐述了人工智能领域的技术研究、产业投入、服务应用,为促进人工智能技术和产业发展提供一定的基础资料与指导。如果想收藏《2018世界人工智能产业发展深度分析报告》全文,可以在公众号后台对话框回复关键词AI2018获取。以下为报告精选内容干货:01AI发展大事件AI大致可分为三个阶段,分别是1、人工智能的诞生;2、人工智能步入产业化;3、人工智能迎来爆发。▲人工智能的诞生▲人工智能步入产业化▲人工智能迎来爆发02各国AI相关政策人工能的迅速发展将深刻改变人类社会和世界的面貌,为了抓住AI发展的战略机遇,越来越多的国家和组织已争相开始制定国家层面
进程管理就是对服务器性能的管理和协调,在程序的运行角度来看非常重要,也可以根据操作进程的手段,衍生很多实用和智能的功能,以下就是介绍一个自己写的进程通用操作类,功能如下:1.把ProcessUtility类直接复制到程序中即可实用。2.调用方法ex:ProcessUtility.resetProcessByPName("explorer");代码如下:usingSystem; usingSystem.Collections.Generic; usingSystem.Diagnostics; usingSystem.Linq; usingSystem.Text; ///<summary> ///author:Stone_W ///date:2010.12.20 ///desc:进程管理类 ///</summary> publicclassProcessUtility { #region进程的cpu使用率 ///<summary> ///进程的cpu使用率 ///</summary> ///<paramname=&
进程关系 进程组 进程组是一个或多个进程的集合。通常,它们是在同一作业中结合起来的,同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID。每个进程组有一个组长进程,该组长进程的ID等于进程组ID。从进程组创建开始到最后一个进程离开为止的时间称为进程组的生命周期。 #include<unistd.h> pid_tgetpgrp(void); 返回值:调用进程的进程组ID intsetpgid(pid_tpid,pid_tpgid); 返回值:成功,返回0;失败,返回-1 说明: setpgid用于添加进程到一个现有的进程组,或者创建一个新的进程组。 函数将进程ID为pid的进程加入ID为pgid的进程组中。 如果pid==pgid,则pid指定的进程变为进程组长; 如果pid==0,则使用调用者的进程ID; 如果pgid==0,则将pid用作进程组ID。 会话 会话是一个或者多个进程组的集合。进程组通常是由shell管道编制在一起的,如下: proc1|proc2& proc3|proc4|proc5
$SoucePath=Read-Host"请输入仓库目录,可空"; $firstTimeDir=Read-Host"请输入项目名称,可空"; $SvnAddress=Read-Host"请输入Svn地址,可空"; $GitAddress=Read-Host"请输入Git地址,可空"; #记录当前脚本目录 $pspath=pwd; if($SvnAddress-eq$null-or$SvnAddress-eq""-or$GitAddress-eq$null-or$GitAddress-eq"") { echo"syncsvntogit."; if($SoucePath-eq$null-or$SoucePath-eq"") { throw"[-SoucePath]cannotbeempty."; } #进入源码目录 pushd$SoucePath; #如果local-git-svn分支存在才执行这条命令 gitbranch-dlocal-git-svn; #创建分支并切换到local-git-svn gitcheckout-blocal-git-svnrefs/remotes/
题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。 解法:在Dinic的基础下做spfa算法。 1#include<cstdio> 2#include<cstdlib> 3#include<cstring> 4#include<iostream> 5#include<queue> 6usingnamespacestd; 7 8constintN=5010,M=50010,INF=(int)1e9; 9intn,m,st,ed,len=1; 10intlast[N],vis[N],id[N],pre[N],flow[N],d[N]; 11structnode{inty,fl,co,next;}a[2*M]; 12queue<int>q; 13 14intmmin(intx,inty){returnx<y?x:y;} 15voidins(intx,inty,intfl,intco) 16{ 17a[++len].y=y,a[len].fl=f
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1229 题意: 大街上到处在卖彩票,一元钱一张。购买撕开它上面的锡箔,你会看到一个漂亮的图案。图案有n种,如果你收集到所有n(n≤33)种彩票,就可以得大奖。请问,在平均情况下,需要买多少张彩票才能得到大奖呢?如n=5时答案为137/12。 分析: 已有k个图案,令s=k/n,拿一个新的需要t次的概率:(s^(t-1))(1-s);因此平均需要的次数为(1-s)(1+2s+3s^2+4s^3+…)=(1-s)E,而sE=s+2s^2+3s^3+…=E-(1+s+s^2+…),移项得(1-s)E=1+s+s^2+…=1/(1-s)=n/(n-k)换句话说,已有k个图案:平均拿n/(n-k)次就可多搜集一个,所以总次数为:n(1/n+1/(n-1)+1/(n-2)+…+1/2+1/1) 代码: 1importjava.io.
Description A国需要发展他们的道路建设,他们需要一个可靠的道路网络,使得任意一条道路瘫痪,整个国家仍然连通。作为A国的道路工程师,给你当前A国的道路图,你需要计算至少需要新建设多少条道路才能使得此道路网络是可靠的,并任意给出一种可行方案。约定A国有N个城市组成,当前有M条双向道路,其中两个城市之间允许存在多条道路。保证最初的道路网络中,这N个城市是相互连通的。 Solution 如果要一个图没有桥,那么只需要让这个图上的所有边都至少属于一个环即可。 那么可以先对原图中有的环进行缩点,由于图是联通的,所有缩点之后图会变成一棵树,那么题目就是让一棵树没有桥。 很显然的想法是叶子结点两两连边,但这两个叶子节点之间的路径一定要经过根节点,所以必须钦定一个顺序来连边。 首先叶子结点的个数决定了要加多少条边,记作\(x\)。为了满足要求,只需要将第\(i\)个和第\(i+\lfloor\frac{x}{2}\rfloor\)个叶子结点连起来。如果\(x\)是奇数,那么把随后一个叶子节点连向根即可。 当然存在一种情况使得一棵子树内的叶子结点个数超过了\(\lfloor\frac{x}{2
学习xxl-job定时任务时了解到基于JVM的Grovvy脚本语言、搭建Jenkins时知道了编译API 1.Java脚本机制 Java的脚本API可以让我们调用JavaScript、Grovvy、Ruby等脚本语言,它避免了编译和链接环节,具有如下优势: 可快速变更,不断实验(Java9已经有JShell可以实验了) 可修改运行着的程序行为 支持程序定制化 1.1使用示例 publicstaticvoidmain(String[]args)throwsException{ //获取JS脚本引擎 ScriptEngineManagerscriptEngineManager=newScriptEngineManager(); ScriptEnginejsEngine=scriptEngineManager.getEngineByName("JS"); //执行脚本语言 Stringscript="varnum=1+2"; jsEngine.eval(script); //也可以从流中获取脚本 FileInputStreamfileInputStream=newFil
1.查找方法 match方法(只匹配字符串开头) search方法(扫描整个字符串,找到第一个匹配) findall方法(扫描整个字符串,找到所有的匹配)返回的是匹配的字符串 finditer方法(扫描整个字符串,找到所有的匹配,并返回一个可迭代对象) print(re.match('h','ellh'))#None print(re.search('h','elhsh'))#<re.Matchobject;span=(2,3),match='h'> print(re.findall('h','heeldhssh'))#['h','h','h'] a=re.finditer('h','sdhsdh')#<callable_iteratorobjectat0x000000000221D988> print(list(a))#[<re.Matchobject;span=(2,3),match='h'>,<re.Matchobject;span=(5,6),match='h'>]可用for循环迭代或者next