NSSCTF靶场题解(6)

站在小白的视角上,写了在写题目的wp方面更多是想体现题目思考的逻辑和细节,更多是写给同样新手小白的内容,解题方面为什么从这一步到下一步的,很助于培养思考题目的逻辑思维,尽我所能把细节阐释到位,有些地方可能理解说辞不是特别到位,如果有问题就麻烦各位大佬师傅指点~

这次题解库收集了很多2024LitCTF【web方向】的内容。

个人认为刚入门web安全这块可以去NSSCTF靶场上刷一下LitCTF的题。比较简单~

其他刷题记录可以在博客主页上看到。主方向是web。


目录

[LitCTF 2024]高亮主题(划掉)背景查看器

[LitCTF 2024]SAS - Serializing Authentication

[LitCTF 2024]exx

[GXYCTF 2019]BabySqli


[LitCTF 2024]高亮主题(划掉)背景查看器

开题。

代码审计一下:

GET传参url,如果url之中含有【..】则回显【Access denied.】

反之则对传入的url进行文件包含。

综上。题目方向基本上是文件包含漏洞。

本想试试如果触发过滤机制。

就传入了:/?url=../../../flag.php

但并没有设想中的回显【Access denied.】

什么都没有回显。

我再传入:/?url=php://filter/convert.base64-encode/resource=flag.php 也是一样的结果。不报错也没有任何反应。

这可能意味着。参数url确实允许传入,但是不论我们传入什么都会被替换成空【避免被执行PHP代码】或者只是当作字符串。

但是注意到。我们用hackbar传参的时候。POST方法处有一个【theme1.php】

.php?

非常可疑。

试试它有没有反应。

这个回显就意味着,theme处才存在真正的文件包含漏洞。

而且根据它的报错回显

Warning: include(): Failed opening 'themes/../../' for inclusion(include_path='.:/usr/local/lib/php') in /var/www/html/index.php on line 11

看到【../】大概方向是目录穿越漏洞。【个人经验之谈。】

本来写的好好的。用BP抓包才发现原来我根本没写../../../../../../flag

实际操刀建议用BP。稳妥一些。

不知道为什么用Hackbar发包就是只给我传【../../】,其实我写的是【../../../../../../flag】。

拿到flag咯。算是一道简单的文件包含题目。

[LitCTF 2024]SAS - Serializing Authentication

开题。

随便写了点东西点击绿按钮看看什么反应。【建议结合BP看看】

再结合初始页面的码源。大概是个简单的php反序列化。

只要对对应的用户名【admin】和密码【secure_password】对应上了就好了。

具体参考这段代码:

$this->username === 'admin' && $this->password === 'secure_password';

这个poc链非常好造。

//poc
​
<?php
highlight_file(__FILE__);
class User
{
​
    public $username;
    public $password;
}
​
$a=new User();
$a->username ="admin";
$a->password = "secure_password";
​
#结合页面内容:$user = unserialize(base64_decode($data));而我们传入的就是data
$b=serialize($a);
$c=base64_encode($b);
echo $c;
?>
这里是我编写好上述php代码后放进phpstudy_pro的WWW目录下,再开好阿帕奇服务器,最后本地访问的结果。

传入。

得到flag。

[LitCTF 2024]exx

开题。

...

我勒个pornhub。

既然说是XXE,为了确定一下,我们随便输入一些密码登入再发包看看。

用最原始的payload读flag文件:【这里无过滤用模板即可

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user><username>
&xxe;
</username><password>123456</password></user>

撇开这道题,以后同类型的题目如果有过滤其他字符我们可以找替换。这道题的payload基本上就是最原始的,适用范围很大。

[GXYCTF 2019]BabySqli

开题。

一个登入界面。由于是SQL注入的题。

我们测试看看哪个地方是注入点。

就用最常用的单引号去测试一下。

ok。测试结果很明显。用户名那边是我们的爆破点。SQL注入类型为字符型。

回显内容:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin''' at line 1 

看看万能密码可不可以登入。

看来是碰到过滤了。看看是什么东西被过滤了。【预计是关键字】

测试到现在为止,我们可以知道,【#,1,‘,空格】都不是被过滤的。

等于应该被过滤了。

结合前面的内容,目测是or被过滤。

不放心可以再来个sql_fuzz字典爆破一下。

//sql_fuzz.txt过滤项【以下内容均被ban】
​
or
xor
(
)
=
'1'='1
oorr
floor
rand()
information_schema.tables
concat_ws()
order
CAST()
format
ord
for
=

确实如预计所言,等号和or都被ban了。

我们要是想判断字段回显数,可以结合sql数据库大小写敏感这个特点绕过对于or的过滤。

payload:

1'Order by 1#

3 的时候都是可以回显的。说明只有三个字段。而且表单名大概是 id,username,password

看看哪个字段回回显。

1'union select 1,2,3#

没有任何提示性线索,这就意味着我无法确定哪个字段可以回显。

没什么思路了。

先信息搜集一下【扫目录,看码源,BP抓包看回显和发包内容】,看看有什么有用的。

在码源处发现一串长码。

只有大写字母和数字。应该是base32编码【base32编码特征】

base64编码应该是有大小写字母,加上结尾两个等号。算一个小常识。

拿去base32解码一下。

得到的这串基本上就是base64了。

再拿去base64解码一下。

select * from user where username = '$name'

一句sql语句,根据输入的用户名来查询数据库。所以注入点也在用户名的地方,而不是密码。

到这里,看了其他师傅的wp,才知道SQL注入中有一个很重要的知识点

SQL中,在使用union进行查询的时候,

即使你查询的数据不存在,数据库也会创建一个虚拟的数据放在数据库中

意思就是即使查询的密码是不存在的,数据库也会创建一个虚拟的数据进去。

我们就利用这点来获取FLAG。

我们已经证明数据库中只有三列,所以我们猜测这三列是id,username,password,而且一般在数据库当中,password中的数据都是用md5进行加密的,所以我们只需要去构造我们想要的密码的md5的值。

1'union select 1,'555fn','006f52e9102a8d3be2fe5614f42ba989'#    
​
//这里的密码【'006f52e9102a8d3be2fe5614f42ba989'】是168在md5加密后十六进制下的字符串,【#】是用来阻断后方代码执行的,相当于【//】

密码的地方就写168就可以了。

但是我写用户名为’555fn‘是得不到flag的。

只有写成’admin‘才可以不是很理解为什么。

所以最后的payload是:

//对应BP终端抓包内容
​
name=1'union select 1,'admin','006f52e9102a8d3be2fe5614f42ba989'#&pw=168
用户名为555fn时候回显为【wrong user!】
用户名为admin时候才回显flag。
  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值