【CTF-web】攻防世界 Web入门题
攻防世界 Web入门题
每个专家都曾经是初学者
1.view_source
-
F12
-
看到注释里的
cyberpeace{0a26734959be18500fc850955ea75f72}
,直接复制即可。- 可能第一眼看到的不能复制,可以切换到源代码界面
- 注意复制形如上式的结果,尤其检查最后不要多一个空格
2.get_post
- 确保安装好插件HackBar,按F12可看到有该选项。
- 在输入框里输入好题目网址,后面加?a=1,如
http://61.147.171.105:50496/?a=1
。点击Execute - 勾选Post data / 新版本是启用Use Post method(用Post方式继续发送)
- 在新出现的输入输入b=2,单击execute,回显出正确flag
3.robots
-
【前置知识】
robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。
-
可直接访问
靶场ip/robots.txt
,查看上述文件 -
可以看到该txt写了Disallow: f1ag_1s_h3re.php,意思是flag在这个文件里
-
访问
靶场ip/f1ag_1s_h3re.php
得到flag
4.backup
- 【前置知识】
备份文件后缀名有:- .git
- .svn
- swp
- .~
- .bak
- .bash_history
- .bkf
【法1】手动遍历上述文件后缀名,看看存在哪个备份文件
- 访问形如
61.147.171.105:64590/index.php.bak
的地址,发现访问成功,开始下载 - 用记事本等文本编辑器打开即可看到flag
【法2】利用dirsearch工具
- 打开dirsearch的安装目录,输入cmd打开终端
- 执行
python dirsearch.py -u http://61.147.171.105:64590/
200 - 500B - /index.php.bak
成功,说明该文件存在,回到浏览器访问- 注意到遍历很慢是因为它扫描的是完整的,可以使用
python dirsearch.py -u http://61.147.171.105:64590/ -e php
,指定只扫描.php文件,可加快扫描速度
- 注意到遍历很慢是因为它扫描的是完整的,可以使用
5.cookie
- F12,选择存储 (如果是Edge是应用Application)
- 看到有一个值为cookie.php,访问它
- 提醒我们看http response(响应)
- 按F12,选择网络,刷新,在响应头里看到flag
6.disabled_button
- F12,注意到按钮部分有个
disabled=""
,使得按钮无法按下,删除它即可。
7.simple_js
-
\x35指的是十六进制的35,而35在Ascii表中为5
-
如题目所述,无论如何也会弹出密码错误的显示。右键查看源代码
<html> <head> <title>JS</title> <script type="text/javascript"> function dechiffre(pass_enc){ var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"; var tab = pass_enc.split(','); var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length; k = j + (l) + (n=0); n = tab2.length; for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i])); if(i == 5)break;} for(i = (o=0); i < (k = j = n); i++ ){ o = tab[i-l]; if(i > 5 && i < k-1) p += String.fromCharCode((o = tab2[i])); } p += String.fromCharCode(tab2[17]); pass = p;return pass; } String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30")); h = window.prompt('Enter password'); alert( dechiffre(h) ); </script> </head> </html>
-
我们分析一下这段代码:
- 首先定义了一个dechiffre函数,将传入的pass_enc加密
- 但是经过缜密的分析后,发现传入什么都没有用,因为返回结果一定会是
FAUX PASSWORD HAHA
! - 最后执行一个弹窗提示。
-
那只能思考是不是传入的pass_enc是正确结果呢
-
(python)先打印出传入的值:
s = ("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31" "\x30\x37\x2c\x34\x39\x2c\x35\x30"); print(s)
输出
55,56,54,79,115,69,114,116,107,49,50
-
这似乎能对应到ASCII码
先把上述输出分隔开来,在分别打印出其Ascii值
s = s.split(","); # 按,分割开来,变为数组 c = "" # 存储结果 for i in s: # 把每个数字变为char,即对应的ASCII i = chr(int(i)) c = c+i # 遍历出来的结果接到后面 print(c)
得到
786OsErtk12
-
-
题目中告诉我们(Flag格式为 Cyberpeace{xxxxxxxxx} ),那么把得到的结果复制进去,果然成功了!
8.xff_referer
- 【前置知识】
- xff(X-Forwarded-For):获得HTTP请求端真实的IP,可伪造
- referer:告诉服务器该网页是从哪个页面链接过来的,可伪造
- 题目告诉我们的ip必须为123.123.123.123,可以考虑到用HackBar修改xff
- F12打开HackBar中点击Load URL,然后Add Head,输入
X-Forwarded-For: 123.123.123.123
,单击Execute执行。意思是改变请求头中的xff为123.123.123.123 - 又告诉我们来源要从
https://www.google.com
点击来,这可以通过referer修改 - 勾选Referer,或者直接Add Header手动输入Referer,然后输入要求的网站,再次执行即可。
9.weak_auth
-
[前置工具]
- FoxyProxy :等类似浏览器插件,能够代理流量,配置好代理(端口设置为8080)
- Burp Suite:能够抓取流量包,而从哪抓就需要上面的插件了(默认抓取8080端口)
- 爆破字典:记录了常用的密码等等,这种字典很好找,例如TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (github.com)
-
打开靶机是一个登录页面,随便输入后提醒我们要以admin账号登录
-
再次尝试登录不出意外的密码错误,不过这时查看源码,它提醒我们需要一个dictionary(字典),顾名思义,字典里收录了常用的密码
-
难不成要手动一个一个测试密码来爆破吗?不可能,所以就需要用到[前置工具]了。
-
在登录页面打开插件,开启监听,再次尝试登录发现网站一直转圈,说明流量包被截断了。
-
此时打开Burp,发现代理(Proxy)选项中有了响应,这就是刚才发出去的东西。
-
POST /check.php HTTP/1.1 Host: 61.147.171.105:52380 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 36 Origin: http://61.147.171.105:52380 Connection: close Referer: http://61.147.171.105:52380/ Upgrade-Insecure-Requests: 1 Priority: u=1 username=admin&password=123456666666
最后一行是我输入的账号和密码
-
右键,选择发送到测试器(Intruder),给password后面的添加上标识
- 切换到有效载荷(Payload)页面,加载常用密码
- 回到位置页面(Position),点击右上角的开始攻击(Attack)即可,等待测试好每一个。当发现长度有一个不一样的,说明进入到成功的页面了
- 选中后查看响应包即可找到flag
- 最后记得把插件关了,否则都被拦截掉了。
真没我尝试登录的时候一下就进去了。。。
10.command_execution
- 【前置知识】Linux的或|,如果两条指令之间用|分割,只会执行最后一个指令,如输出1 | 输出2,
echo 1 | echo 2
执行后只输出2;此外一些简单的指令如下
ping -c 3 www.baidu.com # ping三次www.baidu.com
ls # 查看当前目录下文件
/ # 根目录的地址
cat 1.txt # 输出1.txt的内容
-
随便输入一个
www.baidu.com
,有ping -c 3 www.baidu.com
的回显,也就说明了这是一个Linux指令 -
那么我们可以在这个输入框里输入指令,但是直接输入的内容会被当时ping的地址,所以就用到
| ls
指令,让它运行后面的代码ls,有如下回显,没有flag。ping -c 3 | ls index.php
-
一般来说flag会放到根目录或家目录下,执行
| ls /home
,发现flag.txt,用| cat /home/flag.txt
得到flag
11.simple_php
-
【前置知识】
- php页面可以在地址栏里传参,如
http://61.147.171.105:59329/?a=0
,让a等于0 - php在低版本的松散比较
==
:
- php页面可以在地址栏里传参,如
-
$a=@$_GET['a']; $b=@$_GET['b'];
意思是从地址栏赋a和b的值
-
if($a==0 and $a){ echo $flag1; }
这看着很矛盾的判断,可以参考到上面的松散比较,保证两个都成立的有字符串
-
在地址栏输入
http://靶场ip/?a=abc
,得到回显,不过不是正确答案 -
if(is_numeric($b)){ exit(); } if($b>1234){ echo $flag2; }
又发现一个矛盾的判断,先判断b是否为数字,是的话退出;但又只有b>1234的情况才输出第二个flag
-
可以
http://61.147.171.105:59329/?a=abc&b=1235a
,意思是让b=1235a,在比较时b首先不是数字不会退出。在比较1234时,先会比较1235,到最后的a直接忽略,满足要求,输出结果。