CTF-Web入门wp-XCTF-(1-12)
本人也是刚入门ctf-web系列,写一点wp
另外提供两个学习ctf的网站Hello CTF (hello-ctf.com)和Web 简介 - CTF Wiki (ctf-wiki.org)
入门题目地址:攻防世界 (xctf.org.cn)
view_source
F12查看Flag
get_post
使用HackBar get提交1 (execute)
再post2
得到flag
robots
Training-WWW-Robots这题原理一致
题目提示robots协议,可以自行百度robots,应该是与爬虫相关的协议,可以尝试访问(同时也可以通过dirsearch扫描,dirsearch是一个目录扫描工具(kali上和windows上安装都行),安装自行百度)
再访问f1ag_1s_h3re.php得到flag
backup
提问备份文件,百度查可得知备份是bak,可以直接访问index.php.bak,下载查看flag
也可以直接扫描
cookie
直接根据提示查cookie
look-here=cookie.php,直接访问
让我们看响应,查的flag
disabled_button
前端知识,disabled,直接改属性disabled去掉得flag,然后点击
simple_js
可能跟js有关
随便输一个密码,挑战到错误页面,查看源代码,发现有js代码,进行代码审计
先不管上面那个函数,看一下调用逻辑,其中\x代表16进制,字符串转换为10进制后:55,56,54,79,115,69,114,116,107,49,50
再调用了dechiffre函数,传入了输入的h
查看函数逻辑,整理下代码
functiondechiffre(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;}
耐心看一下代码,可以发现tab是完全没用的,也就是你输入什么都没用,最终会被tab2覆盖o = tab2[i]
简化下代码:
functiondechiffre(){var pass ="70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";var tab2 = pass.split(',');var i, n, p ="";
n = tab2.length;for(i =0; i < n; i++){
p += String.fromCharCode(tab2[i]);if(i ==5)break;}for(i =0; i < n; i++){if(i >5&& i < n -1) p += String.fromCharCode(tab2[i]);}
p += String.fromCharCode(tab2[17]);return p;}
其实中间两个for循环,逻辑是在处理一个任务,可以合并,把最后的tab2[17]也合并进去,:
functiondechiffre(){var pass ="70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";var tab2 = pass.split(',');var i;var p ="";for(i =0; i < tab2.length; i++){
p += String.fromCharCode(tab2[i]);}return p;}
就逻辑上可见它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串。
但是之前如果是pass字符串的话都是不通过,可以将那段可以字符串代替pass试试,可以跑一下脚本
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],转成字符:786OsErtk12
a =[55,56,54,79,115,69,114,116,107,49,50]
c =""for i in a:
b =chr(i)
c = c + b
print(c)
因为题目提示(Flag格式为 Cyberpeace{xxxxxxxxx} )
做一个包裹就行,得到flag
xff_referer
题目提到xff-referer,可以先百度了解一下
**
X-Forwarded-For
**(XFF)请求标头是一个事实上的用于标识通过代理服务器连接到 web 服务器的客户端的原始 IP 地址的标头。
HTTP 请求的头信息里面,
Referer
是一个常见字段,提供访问来源的信息。可以简单地理解为你从哪个网站过来的。
改xff
改referer
得到flag
weak_auth
题目提示是个弱口令,可以爆破
随便猜了下账号是admin,密码是123456,结果就出来了 0.0
可以通过burp进行爆破(百度burp的作用,是什么)
https://github.com/rootphantomer/Blasting_dictionary/blob/master/常用密码.txt
这里提供一个字典,网上字典很多,自己搜就行,当然如果你一开始试错的话,他也提示了使用弱口令
同时还要安装这个插件,(把所有能勾选的全部取消勾选,界面通用和导入里面)
输入好账号密码后,切换到burp
开启拦截,点击登录
拦截到,右键发送到intruder
选中密码部分,添加payload,在进入payload
从文件中加载你的密码字典开始爆破
查看长度(看看有没有独一无二的),和响应得到flag
command_execution
ping一下127.0.0.1看看,这题题目是命令执行,也有暗示,ping 127.0.0.1出一下结果,可以看到ping- c 127.0.0.1,看看能不能插入其他命令,可以使用管道符号|,可以先了解一下管道符号|(百度),
执行一下ping 127.0.0.1 | ls
可以执行,ctf中flag一般藏在flag文件中,可以找一下
ping -c 3 127.0.0.1 | find / -type f -name '*flag*'
| cat /home/flag.txt
执行一下查得flag
simple_php
代码审计,a要==0,a又要存在且不为0,b不能是数字,b又要>1234 看似有些矛盾
在php中存在弱比较:==(不比较类型)
而强比较(===)不仅比较值还比较类型
此外,如果一个字符为123a的话在比较中会被转化成123,a123则会被表示为0
所以可以构建payload:?a=abc&b=12345a就可以绕过
…(img-JN9GuvuQ-1728547588529)]
simple_php
[外链图片转存中…(img-1xYxcwiM-1728547588529)]
代码审计,a要==0,a又要存在且不为0,b不能是数字,b又要>1234 看似有些矛盾
在php中存在弱比较:==(不比较类型)
而强比较(===)不仅比较值还比较类型
此外,如果一个字符为123a的话在比较中会被转化成123,a123则会被表示为0
所以可以构建payload:?a=abc&b=12345a就可以绕过
版权归原作者 Coding~ 所有, 如有侵权,请联系我们删除。