听说bugku的题很适合新手我就来了,感觉前几题都比较简单也没什么好总结的,就从第四题开始吧,后面要是碰到简单的估计只会略微提起几句,大家要是有不理解的知识点,可以私信我。
就是考察简单的代码审计,只需要传递的what的变量等于flag即可,于是我们可以构造一个payload,用win10的cmd发送,用Burpsuite抓包返包或则firefox的harbar也可以完成这个任务。
payload:curl -d "what=flag" url(你的当前网址)
//-d 表传输信息
题目也给出了主题:矛盾,为什么这么说呢?代码的第一个判断判断num是否为数字,如果不为数字就输出num,但是下一个判断要求num才能输出flag,这就构成了题意。
题目:
但是我们知道PHP的比较方式有 == 和 ===,我个人觉得PHP的比较模式真的有点诡异,它的一些规则大概如下:
1、首先其他部分还是和C/C++的比较方式都差不多;
2、 ==的比较方式中,如果是数字和字符串比较方式就十分奇怪,它会先将字符串开头字符(仅字符串头部出现数字,如 $ a=“12hsdf” 会转化为12,$ a="hsdf12"会转化为0)转化为整数值,然后与数值进行比较,如果字符串中没有数字就直接转化为数值0然后与数值比较。
3、===就不一样,它会对比较的两者进行类型判断,也就是说数值和类型都要比较。
所以比较的时候建议大家用 ===,以防出错。
举几个例子:
//开头数字后面字母
<?php
$a=888;
$b="888a";
if($a==$b){
echo "true";
}
else{
echo "false";
}
//返回 ture
//开头字母后面数字
<?php
$a=888;
$b="a888";//在比较的时候会转化为0
if($a==$b){
echo "true";
}
else{
echo "false";
}
//返回 flase
//开头数字中间字母后面数字
<?php
$a=888;
$b="888a888";//在比较的时候会转化为888
if($a==$b){
echo "true";
}
else{
echo "false";
}
//返回 ture
构造,拿到flag。
/?num=1's'
这一题就比较明显的有一个点击提示然后死循环一只重复点击,一般经验直接查看源码ctrl+u或者f12。运气比较好是unicode编码,unicode编码一般的特点是十分的整齐爱出现\和,还有一点就是特别的长。
看题目:
直接搜索unicod在线Unicode编码转换工具.,将拷贝的内放过去解码即可。成功拿到flag。
题目会一直闪现出一些画面,然后我们查看源码发现源码有flag的字眼出现,我试了试远程命令控制发现不太行,突然我发现源码里面有出现flag,我想把它拷下来但是网页刷新的速度确实有点快,根本来不及赋值,然后就只能另辟蹊径,既然是网页,那我就请求呗网页会发送信息回复,里面应该刚好刷到的flag。
直接构造:然后不断的发包让网页回复包(一定要多发几次),一定会有刚好刷出flag的那一次。
curl url(你环境的网址)
直接上题目:
后面不知道为什么我一直下不到一个提示文件,直接放弃。
好像是一个游戏,打开看还真是一个游戏,还挺好玩。玩了几把之后再继续做题。开始分析开始以为是要做远程命令控制的那种,或者源代码之类的,发现都没有,估计是得拿到一定得游戏分数才能通关,围绕这一点我们发现整个测试环境能有特殊点的就是游戏结束后有一个分享好友和重新开始,这里会生成一个游戏所获取的分数,用BS抓包分析或者查看源代码,看看能不能看到一些关于分数的信息。
我这里玩到275分之后就开始抓包,用BS抓包
抓包内容:
GET /score.php?score=275&ip=183.95.251.39&sign=zMMjc1==
上面的第一句值得我们关注,游戏结束后服务器给发的这个奇怪的包,看到上面有几个等号会不会是有BASE64编码然后再传回去,web就爱对一些数据进行Base64加密然后回传服务器,接下来我们进行游戏结束后的源码阅读,看看能不能找到相关的信息。
看到这个语句和上面的url就对上了,这样我们做一个简单的检验拿上面经过BASE64加密的分数解密看看是不是我们得到的分数,提取出Mjc1得到游戏分数。
知道这样就比较简单了,那我们是不是可以直接构造一个虚伪的游戏包直接发过去,然后通关呢?好像是一个思路赶紧试一试,结果成功。❤️
上题目,提醒你有木马,对于WEB来说一般都是上传木马比较多,这估计是上传了木马之后忘记密码了,,,,让我们破解。啊这,有什么意义呢?(不得不说页面做的还不错)
直接扫描网站目录文件
python3 dirsearch.py -u url
打开这文件,估计就能看到我们想要的东西。
这不是直接抓包,返包拿flag。我平常挂马都是hacker,所以这里我试了三个webshell和hacker和hack,结果到hack就成功了。(“简单概括找后门“ ”然后爆破“)
&esmp;打开一看是一个登录页面,根据经验账号一般都是admin,然后随便输了一个密码进去先抓个包。看看相应包的内容都有什么。
发现这个东西一看就知道试base64的加密,拿出去解密试试。
解密成功,我当时猜想这应该就是密码,以为就要成功拿到flag,结果输了上去发现还是不行,然后还跑了一个top100的字典,重新复盘一下,发现还有一个条件没有使用,提示信息上说它只允许本地管理员访问,我当时在想是不是得把我的IP改为127.0.0.01这种才能访问,但是BS上没有这一项呀,我就在HOST和其他有IP的地方改了改发现还是不行。
改了半天,突然想起,既然不能改为什么不自己构造一个数据包呢?上网查了一下如何构造ip数据包,结果就出来了,构造,然后返包,拿到flag。
X-Forwarded-For: 127.0.0.1
知识点分析 :X-Forwarded-For:是一个 HTTP 扩展头部 XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理 IP。一个 HTTP 请求到达服务器之前,经过三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:X-Forwarded-For:IP0 IP1 IP2
IP3会用tcp与服务器连接,在这个字段的报文还可以进行SQL注入。
文件包含
构造:
/?hello=show_source("flag.php")
或则下面这个
/?hello=highlight_file("flag.php")
好像也是文件包含,直接上,按照上题构造一个输入过去发现输出不成功,打开源码查看,发现提醒到源码在变量之中。
这里就有一个全局变量的概念,首先代码上基本就把我们要输入的字母都基本都进行了过滤。
正则表达式: /^\w+$/
^: 匹配输入字符串的开始位置
\w:匹配字母、数字、下划线,等价于 [A-Z a-z 0-9]
+: 代表至少一个
$: 匹配输入字符串的结束位置
[A-Z a-z 0-9] 以外的字符都不行 ,即我们只能输入符合这些要求才能有反应。
这里就提到一个全局数组GLOBALS,我们构造/?args=GLOBALS,传入字符串, $$ args就构成了$GLOBALS,即可输出全局变量数组的内容。
那既然如此,之后输入全局变量构造/?args=GLOBALS
补充知识:超全局变量,系自己定义好的变量
略,so-so-so-easy.
Unescape解码/解密 ,就是去掉"%u"后,将16进制字符还原后,由utf-16转码到自己目标字符。 如:字符“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”,反之也一样!
源代码:
在线链接: Escap/UnEscape加解密.直接按照拼接的拿上去解密即可。
提交那一部分,得到flag。
&esmp;基础知识就不仔细将了,这里我们直接访问源代码没有回显,是因为服务器对请求进行了过滤,所以我们只需以base64的请求即可绕过服务器。
构造:,拿到编码后去解码即可。
?file=php://filter/convert.base64-encode/resource=/index.php