站在小白的视角上,写了在写题目的wp方面更多是想体现题目思考的逻辑和细节,更多是写给同样新手小白的内容,解题方面为什么从这一步到下一步的,很助于培养思考题目的逻辑思维,尽我所能把细节阐释到位,有些地方可能理解说辞不是特别到位,如果有问题就麻烦各位大佬师傅指点~
这次题解库收集了很多2024LitCTF【web方向】的内容。
个人认为刚入门web安全这块可以去NSSCTF靶场上刷一下LitCTF的题。比较简单~
其他刷题记录可以在博客主页上看到。主方向是web。
目录
[LitCTF 2024]SAS - Serializing Authentication
[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;
?>
![](https://i-blog.csdnimg.cn/direct/9b56a6e9edb74992a3d9ab9cc813224d.png)
传入。
得到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
![](https://i-blog.csdnimg.cn/direct/15fd59011ffe40f6ab62022d0b716167.png)
![](https://i-blog.csdnimg.cn/direct/0fe99379677a4bbeb649114cb660af62.png)