PolarD&N(WEB简单全解)
rce命令执行系统,命运石之门,uploader
命运石之门
1.打开一个登录框,但是看不到验证码,查看下源码,说有时候验证码是否好像不重要,扫描下目录


2.发现了一个password.txt

2.复制然后爆破一手

发现了一个长度异常的,说验证码不对,在去爆破一下验证码

发现了0000是正确的


3.输入进去看一下,成功到下一步
又说要验证密码,还是刚才那个字典接着爆破

发现密码

找到flag

4.知识点
这题大部分都是在爆破密码
参考:
https://xz.aliyun.com/news/18246(大佬的wp)
rce命令执行系统
1.进入是一个命令输入框
试了几个发现都不行,使用\斜杆也绕过不过去,双写也没用,

只能执行env,但还是个假flag

扫描目录发现了flag.txt

2.进入后是这个样子
好像是提示把,l换成1和txt换成php

修改完以后,让我异或后改名字为XOR_KEY,试一试,传参是靶场名字

3.开始攻击
前面需要带上env,因为不带env后面的传参就无法执行,提示禁止特殊字符,把后面的

把这个&符号去除掉后还是没成功

把这个符号左右的字母都删除掉成功得到flag

4.知识点
有时候env里面藏着的是假的flag
ghost_render
1.看到渲染,有可能是模板注入,先上传一个带有模板注入命令的文件
发现有这个回显,是ssti注入,然后使用{{''.__class__.__base__.__subclasses()}},看一下有没有可利用的点


2.发现可利用点,cycler被设计为一个专门用于模板渲染时循环轮换值的工具类
解释payload
cycle.__init__是Cycle类的初始化方法,通过它可以访问类的内部属性
__globalse__属性,函数的__globals__属性会返回该函数所在模块的全局命名空间字典。对于cycle.__init__,其__globals__会指向Jinja2或Cycle库模块的全局变量,其中可能包含敏感模块(如os)的引用
os.popen方法:通过__globals__获取os模块后,调用popen执行系统命令函数,并读取命令输出
payload:{{cycle.__init__.__globals__.os.popen('cat /var/secret_flag').read()}}


简单的链子
1.就一个类,不分析代码了


上传得到flag

0e事件
1.打开说通过URL的参数a提交输出,根据题目名,直接上传个以0e开头的字符串,得到flag

background
1.打开有个按钮,说看背景,查看下源代码

2.源代码
源代码的script.js,里面有一个change_backgroud.php的文件,传参方法是POST传参,下面有两个参数d和p

访问这个去传参一下

然后查看flag

来个弹窗
1.一个输入框,尝试xss语句
提交<script>alert(1)</script>,发现不行,应该是过滤了,使用双写绕过一下


2.成功了,说flag是这个人物的md5加密,上百度识图上发现这个是叫白金之星

给加密一下,第一个就是flag

2.知识点
xss的双写绕过
简单的导航站
1.打开有五个站点,分别打开看看

管理员登录

文件管理

Flag认证系统

登录

注册

2.先注册一个用户登录上看看怎么个事
这里会出现not found的状态,但是能登录上去

登录上去,点击查看用户列表是一串php代码,一个简单的数组绕过,看到了一堆用户名,但是没啥用,因为这些好像也没有管理员的



3.都忘记翻源代码了,去看下源代码
发现了一个可疑的数字,经测试,是一个密码,尝试爆破用户名,发现了用户名是P0la2adm1n,登录一下看一看



3.登录完直接跳到文件管理
上传个木马文件看一下

上传成功了,但是没有路径,扫描目录发现了一个uploads路径,尝试访问这个路径的木马文件


4.没回显,使用蚁剑连接一下

在/var/www/flag???/flags.txt里面发现了好多flag,刚好联合Flag认证系统爆破一下

发现这个是yes,应该是正确的flag


5.知识点
这题关乎到了爆破,信息收集简单的导航站
井字棋
1.打开是个js小游戏,玩了几把发现是赢不了的

2.去调试器里看一下,发现这里可以根据调用这个declareWinner(who),来判断是谁赢了,在控制台输入declareWinner("您赢了!"),获得flag


3.知识点
代码审计能力
button
1.打开是个按钮,但是老是跑,尝试删除一些源代码也没有,在调试器里禁用JavaScript以后不跑了,但是也点击不动,查看下它的调试器

发现了一个带有flag的敏感命令

访问一下,查看源代码得到flag

2.知识点
对代码的审计
狗黑子的RCE
1.打开先分析题目
让GET传参gouheizi1,POST传参gouheizi2,然后使用str_replace将$gouheizi2里面的gouheizi给替换为空,在将值赋给gouheizi2,然后使用正则表达式,过滤掉gouheizi1里面的敏感字符,如果有的话就echo一个badly并exit退出,否的话判断gouheizi2是否强等于gouheizi字符串,如果是,那么就system执行gouheizi1的值,否的话就echo一个gouheizi!

2.开始攻击
第一步先绕过str_replace函数,因为这个是个不可迭代的函数,可以使用双写绕过,然后禁用掉的命令使用\斜杆绕过
payload:GET:?gouheizi1=c\at /fl\ag.php POST:gouheizi2=gogouheiziuheizi


3.知识点
str_replace()函数,用于替换字符串中指定字符(区分大小写)
语法:
str_replace(find , replace , string , count)
find:必需。规定要查找的值
replace:必需。规定替换find中的值的值
string:必需。规定要被搜索的字符串
count:可选。一个变量,对替换数进行计数
绕过方式:str_replace无法迭代过滤,可以通过双写绕过
https://blog.csdn.net/m0_48108919/article/details/123279251(str_replace函数)
投喂
1.打开让我进行一个序列化,参数,类,属性和条件都给我了

2.直接构造

获得flag
投喂
1ncIud3
1.打开就让我使用?page传参导航地址,不知道有啥文件也没法上传,扫个目录,扫到4个文件


flag.php

about.php

contact.php

404.php

2.开始攻击
flag.php里提示了需要替换字符,还要考虑哪些符号被替换了,经过几次上传,发现后缀php是定死的

应该是flag被替换成其他的了,爆破一下,爆破发现替换成其他flag形式都是找不到,尝试把../双写绕过一下


3.发现了f1a9是flag


4.知识点
学习到了一种新的爆破方法,可以让bp自动根据范围来生成字典,还有../被过滤可以使用双写绕过
bllbl_ser1
1.先分析代码
一共两个类bllbl和bllnbnl
bllbl类里一个公共属性qiang,一个__destruct方法,在销毁对象的时候触发,会返回当前对象的bllliang方法
一个bllliang方法,会将本对象里的qiang指向close方法
bllnbnl类:一个公共属性er,一个close方法,会执行当前对象的er属性的值
if检测有没有GET传参blljl,有的话就将他的值进行反序列化并赋值给$user_data


2.就两个类直接开始构造
bllbl:: __destruct ---> bllbl:: bllliang ---> bllnbnl::close
查看源代码得到flag


rapyiquan
1.先分析代码
前三行,报错不显示,高亮显示当前文件,定义一个header头
使用$_SERVER['REQUEST_URI']获取当前URL路径
调用一个 checkUrlParams函数来验证URL参数来检查传入的参数是否包含_下划线如果有就返回false,否的话返回ture
判断 checkUrlParams($params) 是否为true,是的话就将GET传参的c_md赋值给$cmd,然后使用正则表达式过滤掉$cmd里面的敏感字符,如果有就echo一个badly,否的话就使用反引号执行$cmd里的参数

2.开始攻击
既然下划线被过滤掉了,可以使用[中括号来代替它,然后命令可以使用斜杠\绕过
payload:?c[md=l\s /

看到了flag,使用斜杠绕过,查看源代码得到flag
payload:?c[md=c\at /fl\ag.php


3.知识点
可以使用\斜杠来绕过正则表达式,使用[中括号来代替下划线
upload1
1.打开是个上传文件的页面

2.随便上传个php文件,有限制,bp抓包修改后缀


3.成功上传,蚁剑连接一下


4.知识点
文件上传之bp修改后缀绕过
审计
1.先分析代码
报错不显示,然后把flag.php文件包含在这里面,高亮显示当前文件
if检查是否GET传参xxs,有就继续下面的语句,将GET传参的xxs赋值给input,if判断$input是否为数组,如果是的就退出脚本,说不允许为数组,否就继续下面的语句
判断md5加密后的$input,是否以0e开头并且后面要跟上数字,^表示开始位置,+表示[0-9]可以出现一次或多次,即+表示至少一个数字,否的话就退出脚本,并说必需以0e开头,并跟随数字
然后检测到$input如果不是数字就退出脚本,并说必需是数字
都通过就输出flag

2.开始攻击
直接使用数组绕过中的0e绕过,一下全满足了

3.知识点
240610708,经过md5加密后为0e462097431906509019562988736854,刚好满足0e和后面跟上数字了

参考:
https://segmentfault.com/a/1190000046400554
debudao
1.打开是一个输入框

先进行简单的信息收集,发现源码有个flag,但这是假的,这个代码的意思检查当前网页的URL中是否包含search=参数,如果有,就把提取search传入的参数然后经过url解码后显示在<p>里面

在看看网络和cookie,在cookie里面发现了flag,经过url编码后得到flag


2.知识点
信息收集
扫扫看
1.打开让我扫一扫

扫描下目录发现了个flag.php

访问一下,查看源代码得到flag


3.知识点
对目录扫描工具的利用
机器人
1.打开是这个界面,扫个目录


2.发现了robots.txt文件,访问一下

得到了一半flag,另一半应该在上面这个禁止访问的路径下面,经过尝试在这个路径的flag.php文件里面

PHP反序列化初试
1.先分析代码
就两个类Easy和Evil
Easy类:一个公共属性$name,一个__wakeup方法,在被unserialize的时候触发,会echo当前对象的name属性
Evil类:一个公共属性$evil,一个私有属性$env,一个__tostring方法,在被当成字符串的时候触发,会返回$this->$env=shell_exec($this->evil),然后返回当前对象env的值
if判断是否GET传参easy,如果有就将它进行一个反序列化的操作

2.开始攻击
就两个类,所以攻击逻辑为
Easy:: __wakeup() ---> Evil:: __tostring
因为有特殊属性,就需要url编码一下,然后在类里面实例化它


uploader
1.先分析代码


2.然后这题有两种解法
第一种:本地搭建一个上传文件的表单,然后上传一句话木马,得到返回路径,拼接URL去蚁剑连接


上传一句话木马

然后自动跳转到题目的链接,再去拼接路径



根目录下发现flag

第二种:使用python脚本上传post请求,来上传文件

也是拼接链接



3.知识点
考察对文件上传自己上传表单,知道了如何碰到没有上传文件入口的题目如何做了
cool
1.先分析代码
if检测有没有GET传参a,并把GET传参a的值赋值给$a,if判断$a是否为数字,如果是的话就echo一个no,否就使用正则表达式判断$a是否有这几个命令,没有的话就eval执行$a

2.可以看到把system禁用了,可以使用passthru来代替
?a=passthru("ls");

然后cat查看一下

3.知识点
可以使用passthru来代替system
干正则
1.先分析代码
if判断是否有GET传参的id,并且使用empty判断它是否为空,如果都满足,那么就显示当前文件,并退出脚本
否的话就包含一个flag.php,并把$a赋值为www.baidu.com,$result赋值为空,GET传参的id赋值给$id,使用parse_str把$id它解析为变量并设置到当前作用域,但是因为没设置第二个参数result会导致报错,而使用@来抑制报错,然后echo出$a索引值为0的值
if判断如果a[0]的值等于www.polarctf.com的时候就继续下面的语句,将GET传参的cmd赋值给$ip,使用正则表达式,检测$ip里面是否有敏感字符,如果有就退出脚本,并警告
否的话就使用shell_exec执行ping -c 2并把$a[0]和$ip的值分别拼接到后面,然后将结果在赋值给$result,if检测如果有$result的话就echo出$result

2.开始攻击
首先需要传参一个id,还有满足$a[0]为www.polarctf.com,然后才能传参cmd让shell_exec执行命令
可以这样传递,?id=a[0]=www.polarctf.com,这样就能让a[0]的值为www.polarctf.com了

然后开始命令执行,因为它们都是拼接在一起的所以需要使用管道符给间隔开,这样才能分开执行命令
可以看到ls查看到了flag

使用tac查看一下,可以使用反引号先执行ls然后再tac查看全部,也可以直接tac f*


3.知识点
这题运用到了URL查询字符串中的数组参数传递方法
shell_exec命令:通过shell执行命令并将完整的输出以字符串的方式返回
语法:
shell_exec(string $command ) : string | false | null
command:要执行的命令
string包含已执行命令的输出,如果无法建立管道,则为false,如果发生错误或者命令不产生输出则为null
参考:
https://www.php.net/manual/zh/function.shell-exec.php(shell_exec命令)
$$
1.先分析代码
高亮显示当前文件,报错不显示,把flag.php文件包含在这里面
GET传参一个c并赋值给$a,检测是否GET传参c,然后使用正则表达式,如果检测到$a里面有敏感字段就退出脚本并显示警告语句
否的话,就eval执行并打印出var_dump($$a),这里的$$a是关键

2.开始攻击
可以看到eval执行命令的地方里面有两个$$,这就能导致使用超全局变量的出现,因为让$a=GLOBALS,那么到执行命令那里就成了eval($GLOBALS),会导致引用全局作用域中可用的全部变量

3.知识点
$GLOBALS:引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键),与所有其他超全局变量不同,$GLOBALS在PHP代码中任何地方总是可用的。
$GLOBALS和globals的区别
$GLOBALS['var']是外部的全局变量本身,而global $var是外部$var的同名引用或者指针,也就是说global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,而$GLOBALS[]确确实实调用的是外部的变量,函数内外会始终保持一致。
参考:
https://www.runoob.com/php/php-superglobals.html($GLOBALS)
upload
1.打开是个上传文件的页面先随便上传一个php木马

2.可以看到php被过滤掉了,使用双写绕过


3.蚁剑连接得到flag


4.这是访问?action=show_code出来的源码
检查用户是否提交了表单,如果是就进行下面的,然后检查一个名为UPLOAD_PATH的文件夹是否存在,如果存在就接着上传文件的操作
建立了一个扩展名黑名单,然后获取上传文件的名称,并通过str_ireplace函数去掉文件名与deny_ext数组匹配的扩展名
获取临时文件的路径
生成一个新的文件路径,文件将被存储在UPLOAD_PATH目录下,文件名由一个随机数和原文件名组成
将临时文件移动到指定的目标路径。如果上传成功,$is_upload被设置为true。如果上传失败,$msg被设置为错误信息上传出错
如果上传路径不存在,会输出让用户手动创建

5.知识点
文件上传的双写绕过
爆破
1.打开先分析代码
检测有没有GET传参pass,并进行md5编码后赋值给$pass,然后使用substr取出他的索引值为1,14,17三个数需要让它们强等于,然后再返回它们的整数值,进行相加,然后除以索引值为1的值,然后强等于索引值为31的数,通过了就把flag.php包含进去,并ehco出$flag

2.使用ai生成脚本跑一下,上传得到flag


3.知识点
对ai工具的利用
XFF
1.打开告诉只有ip是这个才能访问

2.抓包去添加一个xff,成功得到flag

3.知识点
对xff的应用
jwt
1.进入让我们登录或者注册,我们先随便注册一个
2.注册完登录一下

3.然后点进个人中心抓包

4.看到了个两串字符,一个session 和一个 jwt ,看wp说需要是用jwt工具解码
5.解码完看到了自己的用户名字,把改成admin试一试对不对


6.给新改的换上去,在发包,得到flag

7.知识点
知道了jwt(JSON Web Token)是一个开放标准,它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。
在线jwt解码
ezupload
1.打开随便上传个文件,说只允许GIF文件上传

2.去改个后缀,然后丢到bp抓包,改为php后缀,可以看到上传成功了

3.去蚁剑连接一下,找到flag

4.知识点
运用到了文件后缀绕过
php very nice
1.这一题就一个类,也就一个魔法函数,分析一下
定义了一个$sys='Can you find the leak?' 然后调用了析构函数_destruct,如果被销毁时触发,然后eval执行sys,最后反序列化传入的GET传参的a

2.最后一步要执行$this->sys,可以直接给$sys的值给变成恶意的执行命令,然后触发析构函数,从而执行命令
先查看一下


3.看到路径了再输出就得到了flag


4.知识点
_destruct()函数是析构函数在对象的所有引用被删除或者当对象被显式销毁时执行
相关资料:
https://blog.csdn.net/weixin_45954730/article/details/131861020
session文件包含
1.打开是一个对话框,随便输入一个,跳转到另一个地方了,发现了get传输的file

2.那两个文件都没啥东西,尝试php伪协议能不能读action.php的源码,还真有,解码一下

3.解码完是一个session文件包含漏洞代码
第一行是开始会话
第二行报错不显示
第三行是把POST传参的name赋值给$name
第四行是如果有值就写入到$_SESSION["username"]
第五行是表示程序会动态的包含一个由用户控制的文件路径,这是经典的本地文件包含漏洞点

4.然后看一下它的PHPSESSID是什么好访问路径

5.尝试访问路径,一共就那几个路径,都试一下发现成功了

6.接下来使用POST传参的name可以上传一句话木马

7.就正常命令执行就行查看到flag

8.查看一下,得到flag

9.知识点
什么是session文件包含
https://blog.csdn.net/Z526209693/article/details/125431252
常见的php-session存放位置:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
签到
1.进入看到个提交页面,但是提交的按钮不能用,去查看下代码

2.发现了个禁止按钮命令,给删除掉,随便输入flag
3.告诉我输入这个就能得到flag,但是注意的是这个有十几位,而题目限制9位,只能去bp上抓包输入

4.放行得到flag

5.知识点
对js代码的识别,和对bp抓包的使用
被黑掉的站
1.点进去告诉我们网站被黑了,我们的右键也没了,按f12看下代码,也没发现啥东西,扫描一下目录

2.扫描到了两个路径

3.我们分别访问一下,第一个是很多密码,第二个是个登录界面

4.我们给密码给排列好然后去bp里面爆破

5.最后发现了一个长度不同的看一下响应发现flag

6.知识点
这题运用到了目录扫描工具dirsearch
然后还有bp爆破的使用
rce1
1.进入还是老套路,界面上告诉了就过滤个空格,我们直接127.0.0.1;ls 查看一下,都有啥东西

2.看到了flag,直接查看然后用${IFS}来代替空格
payload:127.0.0.1;cat${IFS}fllllaaag.php

3.知识点
考验对Linux命令的应用
简单rce
1.打开先分析下代码
1.高亮这个文件
2.定义一个no函数,并传入变量txt
3.使用正则过滤的方式过滤这些函数
4.通过了就返回这个参数的值
5.否的话就输出一条消息,并退出当前脚本
6.通过post的方式传递参数yyds
7.判断有没有GET输入sys和并判断yyds是否等于666
8.调用no函数,并输出
9.否就输出nonono

2.看代码发现空格也没了,但是可以使用%09代替,查看文件的也可以使用sort代替,然后执行系统外部命令的我们可以使用用passthru(),先查看下flag在哪里,使用ls查看一下
直接构造payload:?sys=passthru("ls%09/") post里传入yyds=666

3.看到了在根目录下的flag里,直接查看,得到flag
payload:?c=passthru("sort%09/flag"); post里传入yyds=666

4.知识点
sort也可以读取文件命令
%09代替空格
passthru直接将结果输出到浏览器
swp
1.进去没有啥东西,先扫描一下目录,看到了一个链接,访问一下


2.整理后的代码就是这样的,分析一下,大概意思就是
我们需要post一个名为xdmtql的变量,然后这个变量不能是数组。不能与/sys.*nb/is正则匹配,但是结果的sys nb要在第一位

3.看网上说的使用回溯绕过法,就能跑出来flag

这段代码的意思是,导入requests库,用于发送http请求
想目标url发送一个post请求,post请求的内容是data里的"-"*1000000表示将字符-重复100万次,生成一个非常长的字符串
最终的xdmtql参数值是"sys nb"后面跟100万个-
召唤神龙
1.打开是一个召唤神龙的游戏界面,我们只能在没开始的时候,按f12查看源代码,因为之前做过类似的,我们寻找一下可疑的.js链接,挨个点,看到main.js里的有可以的

2.直接把这一串可以的符号,丢到控制台,运行得到flag

3.知识点
对代码的审计
蜜雪冰城吉警店
1.打开看到的是一个奶茶点单系统,告诉我们点到第九个隐藏的就行了

2.我们先随便点下试试,但是没发现啥,就去控制台,里修改一个

3.修改完成,点击对应的按钮就能得到flag

4.知识点
对控制台的使用
seek flag
打开啥也没有,先扫一下目录

2.扫到了个君子协议,访问一下

3.得到了一半flag,在找找另一半
4.在网络里面看到了一个cookie:id=0感觉有点可疑,抓包给它改个值看看有啥反应
5.看到了另一半flag,没想到有三部分,给拼接一下得到flag

6.知识点
熟练的运用bp工具,和对数据包的分析,扫描工具的使用能力
login
1.打开是个登录页面,先查看下源码,发现了两串数字,登录一下,发现登录成功了

2.登录成功我就蒙了,看wp说需要爆破后学号的后两位,去爆破一下发现就10和11有回显,还是个g},感觉东西在前面

3.把爆破后两位改成后一位,发现2-11有回显,拼接一下就是flag

4.知识点
对bp爆破的使用
iphone
1.打开是一个我不要windows的页面,点击一下enter看看有啥

2.发现没啥东西,说抱歉,管理员菜单必须从iPhone或iPad上查看

3.查看下源码,源码说尝试给我一个UA

4.那我们就bp抓包给它换一个UA,上面说要iphone或者ipad的,我们从网上找一个ipad的UA

5.换上去发现flag

6.知识点
知道UA是User-Agent
浮生日记
1.打开看到一个浮生,尝试下sql注入

2.发现没用,看到上面链接上的字,说弹个窗让我看看,感觉是xss语句
随便输入一个

3.发现没反应,检查一下查看器,发现script被过滤掉了

4.我们试一下双写绕过,发现还是不对

5.在试试其他的语句
>"'><scrscriptipt>alert('XSS')</scrscriptipt>,弹出了个弹窗
6.得到flag

7.知识点
让我知道了一些常用的xss语句和双写绕过
<script>alter("")<script>
>"'><script>alter("")<script>
详细资料:https://blog.csdn.net/guanjian_ci/article/details/123017543
$$
1.打开看到php代码,我们先看一下
第一行还是高亮这个文件
第二行是报错不显示
第三行是flag.php包含在这个里面
然后就是变量a传给常量a,检查有没有输入c,使用正则过滤的方法,过滤了这些符号和方法

