攻防世界web进阶
Cat
抓住那只猫
预备知识
url编码字符集
url编码是在浏览器获取的网址包含特殊字符时会将其转换为对应的编码,当然如果正常字符直接使用编码浏览器也是可以正常访问的。
当然如果获取到的编码超过了url编码的限制就可能会出现报错的情况。一般情况下编码超过%80就会出现报错
Django DEBUGE = True
- 如果开启了DEBUG模式,那么以后我们修改了Django项目的代码,然后按下ctrl+s,那么Django就会自动的给我们重启项目,不需要手动重启。
- 如果开启了DEBUG模式,那么以后Django项目中的代码出现bug了,那么在浏览器中和控制台会打印出错信息。否则的我们很难寻找到bug的位置,也不方便调试代码。
- 在生产环境中,禁止开启DEBUG = True,因为当你的网站出错误时,别人能看到你的源代码,而我们也不需要给用户看到这些错误信息。所以需要关掉DEBUG = True,即设置DEBUG = False
- 如果设置了DEBUG = False,那么就必须设置settings.py中的ALLOWED_HOSTS.
ALLOWED_HOSTS:这个变量是用来设置以后别人只能通过这个变量中的ip地址或者域名来进行访问。
phpcurl
当CURLOPT_SAFE_UPLOAD
为ture时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求来读取文件。当且仅当文件中存在中文字符时,Djanjo才会报错导致获取文件内容。
题解
题目让我们输入域名,输入提示域名loli.club 没反应,那就输入几个常见的baidu.com也没反应,输入
127.0.0.1
返回ping的内容PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.064 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.064/0.064/0.064/0.000 ms
输入百度的ip
220.181.38.148
也能得到ping的内容,感觉可以和控制台进行交互尝试输入
127.0.0.1||ls
,127.0.0.1&&ls
,127.0.0.0;ls
发现关键字均被屏蔽了。尝试针对url地址进行搞事情,输入xxx?url=%80, 尝试输入超过gbk编码url编码,发现获得报错信息,赋值报错信息新建一个html文件,打开的得到最终的报错界面,发现这是一个Django的项目,并且DEBUGE 为 true。
可以判断后台运行了两个应用,一个时php应用,一个Django用来处理php发来的请求。
我们可以通过报错信息setting中的database字段获取到数据库的信息
访问http://111.198.29.45:40859/index.php?url=@/opt/api/database.sqlite3的到新的报错信息,还是复制报错信息到新的html文件中,打开发现了File字符段,应该是数据库中的内容,尝试搜索
ctf / flag
等关键字找到flag答案:WHCTF{yoooo_Such_A_G00D_@}
总结
- php通过@访问文件,Djonga报错返回文件内容
- url编码越界可能会引起报错
ics-05
其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
预备知识
文件包含漏洞
php伪协议
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// —RAR
ogg:// — 音频流
expect:// — 处理交互式的流
PHP.ini
在php.ini利用两个重要参数allow_url_fopen和allow_url_include
allow_url_fopen: 默认值为ON, 允许url里封装协议访问文件
allow_url_include:默认值为OFF,不允许包含url里的封装协议包含文件
php://filter
经常使用的伪协议,一般用于任意文件的读取,有时也可以用于getshell。在双OFF的情况下也可以使用。
php://filter是一种元封装器,用于数据流打开时筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用。类似readfile()、file()、fiel_get_contents(),在数据流读取之前没有机会使用其他过滤器。
php://filter参数
名称 描述 resource=<要过滤的数据流> 这个参数是必须的,它指定了你要筛选过滤的数据流 read=<独链的筛选列表> 可选参数,可以设定一个或多个过滤器名称,以管道符` write=<写链的筛选列表> 可选参数,可以设定一个或多个过滤器名称,以管道符` <;两个链的筛选列表> 任何没有以read= 或 read= 做前缀的筛选器列表会视情况应用于读或写链 php://filter/[read/write]=string.[rot13/strip_tags/…]/resource=xxx
filter和string过滤器连用可以对字符串进行过滤。filter的read和write参数有不同的应用场景。read用于include()和file_get_contents(), write用于file_put_contents()中。
php://filter/convert.base64-[encode/decode]/resource=xxx
这是使用的过滤器是convert.base64-encode。它的作用就是读取upload.php的内容进行base64编码后输出。可以用于读取程序源代码后经过base64编码后的数据。
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设置为php://input, 同时post想设置的文件内容,php执行时会将post内容当作文件内容。
需要开启allow_url_include
注:当enctype=”multipart/form-data”时php://input是无效的
file://
file://伪协议在双OFF的时候也可用,用于本地文件包含
注:file://伪协议必须是绝对路径
phar://
PHP归档,常常跟文件包含,文件上传结合考察。通俗点就是php解压缩包的一个函数,解压的压缩包与后缀无关。
phar://test.[zip/jpg/png….]/file.txt
其实可以将任意后缀名的文件(必须要有后缀名),只要是zip格式压缩的,都可以进行解压,因此上面可以改为phar://test.test/file.txt也可以运行。
zip://,bzip2://,zlib://
在双OFF的时候也可以用
zip://test.zip%23file.txt
和phar://一样用于读取压缩文件,不过对于“zip://test.zip#file.txt”中的“#”要编码为”%23“。因为url的#后的内容不会别传送
data://text/plain;base64,base编码字符串
很常用的数据流构造器,将读取后面base64编码字符串后解码的数据作为数据流的传入
preg_replace命令执行漏洞
函数功能:执行一个正则表达式的搜索和替换
定义:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分,如果匹配成功以replacement进行替换
漏洞:
- $pattern 存在/e模式修正符,允许代码执行
- /e 修正符是preg_replace将$replacement当作php代码命令来执行
- 执行的另一个条件是匹配成功
利用举例
preg_replace("/123/e", "system("ls")", "123")
构造的向服务器发送请求的url中的特殊字符要使用其相应的url编码。
题解
访问地址得到一个页面,根据题目发现了一个设备维护中心的页面,点击进去
什么也没有,再点击云平台设备维护中心
发现了get一个请求page=index,感觉像是文件包含漏洞
LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞尝试输入
../
查看文件夹内容无果尝试获取index.php源码,利用php伪协议
?page=php://filter/read=convert.base64-encode/resource=index.php
如果过滤器不设置为进行base64编码,则相当于进行网页请求,会持续执行index.php的代码返回页面。访问构造的url的到一段base64编码
base64转码得到index.php中的内容,下面为其中的一段
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') { echo "<br >Welcome My Admin ! <br >"; $pattern = $_GET[pat]; $replacement = $_GET[rep]; $subject = $_GET[sub]; if (isset($pattern) && isset($replacement) && isset($subject)) { preg_replace($pattern, $replacement, $subject); }else{ die(); } }
发现其中使用了preg_replace函数,而且对get到的变量没有进行过滤,那么我们便可以利用其命令执行模式
/e
我们首先要构造header的x-forwarded-for为本地地址
127.0.0.1
才可以执行 if 中的内容。使用burp project可以修改header
构造get 变量使其能够执行preg_replace函数的命令模式
?pat=/123/e&rep=system("find+-name+flag*")&sub=123
“+”在url中会被解释为空格,当然也能够使用
%20
。补充url,访问,使用burpproject进行修改x-forwarded-for
得到返回的文件地址
再次构造get的变量
?pat=/123/e&rep=system("cat+./s3chahahaDir/flag/flag.php")&sub=123
和上一步一样的访问步骤,修改x-forwarded-for, 最后查看网页源代码也可以查看burp project的http历史记录里面的响应
答案:
cyberpeace{4b8c09620a7c82c9927c7c95f3f07d3d}
感谢
ics-06
云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
根据题意打开那个云台报表中心页面
发现get了一个名为id的变量,感觉像是sql注入,尝试了了一下发现不行,题目提示送分题,直接进行爆破
bur porject对id进行爆破,0-5000爆破,发现id=2333的时候文件长度不一样。
答案:cyberpeace{f0aa51d11c3e11908c8b5ecca74ac81f}
lottery
预备知识
.git泄露
如上图,可以通过url+.git的方式访问到服务器的.git文件(不一定是显示出来,只要是可以访问到即可)便可以通过 GitHack工具获取到网站的原始目录与文件,具体的原理就不赘述了。
GitHack使用方法:
python2 .\GitHack.py http://111.198.29.45:41105/.git/
php弱类型
bool类型的true是可以和任何数据弱类型相等
具体移步php弱类型总结
题解
访问页面,随便注册一个用户,发现是一个赌博游戏,点击Claim Your Prize发现可以用钱买flag,当然这个数目是巨大。
检查页面,尝试是否可以通过修改表单来改变我们的钱,发现我们的钱是存到服务器的数据库里的,只能通过那个猜数界面来进行改变,猜数界面也是通过服务器运行的,找不到bug。
尝试查看robots.txt文件,发现了有趣的东西
好像存在.git泄露
尝试使用GitHack获取网站文件
成功获取。
之前我们检查可以发现,buy flag 和 猜数的那个界面都是指向api.php, 我们查看这个文件
发现了一个猜数的时候有一个弱类型漏洞,那么我们就可以利用这个漏洞来进行刷钱
Burp project 构建代理,拦截猜数页面,改变numbers的值,利用重发器进行重复刷钱。
刷够了之后返回页面刷新发现钱多了好多,然后购买flag
cyberpeace{27c59265cabca6858ba22713d7e175ad}
NewsCenter
预备知识
sql注入
在网页进行表单提交时,将特殊的语句提交到服务器,语句可以是数据库管理的命令,如果服务器端没有对我们提交的表单进行过滤或者过滤的条件不过严格,那么我们的命令便可以在服务器上进行执行。
一般搜索窗口等可能会与服务器进行交互的存在sql注入漏洞的概率较大。
一般可以直接使用sqlmap工具,进行一键检测,具体的使用方法,我也是刚接触,留个坑,有时间专门学习一下,在总结。在此放上别人的总结
题解
打开网页,发现了一个search窗口,可能是xss或者sql注入,针对xss尝试了几个简单的语句如:\之后失败。
接着使用sqlmap,进行自动化检测
首先随便输入几个字母,接着使用burpporject 截获请求头,
复制请求头并保存到header.txt
接着利用sqlamp自动化检测,执行
python2 .\sqlmap.py -r header.txt –bds
发现了一个名为news的数据库,这就证明我们成功的进行了sql注入。
接下啦就是要获取到news中的内容
python2 .\sqlmap.py -r header.txt -D news –dump
得到flag
答案:QCTF{sq1_inJec7ion_ezzz}
总结
以上均为傻瓜操作,具体的实现步骤和内部的过程还要进行深入的学习才能够掌握。
mfw
预备知识
php中的
assert()
会将括号里的字符串当作php命令命令来执行,如果命令执行成功就返回true,否则返回false。.git 泄露
题解
打开网页,点击about,出现了Git字样,作者用到了git, 感觉应该是存在.git泄露,于是尝试访问了一下http://111.198.29.45:58382/.git/,结果还真是。
用githack吧文件下载下来
python2 .\GitHack.py http://111.198.29.45:58382/.git/
审计代码,在index.php里面发现了
// I heard '..' is dangerous! assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); // TODO: Make this look nice assert("file_exists('$file')") or die("That file doesn't exist!");
assert 之前也没有别的对file的过滤,于是可以尝试利用assert的漏洞,获取到我们的flag
在我们下载下来的文件中还有templates下的flag.php这个文件,但是打开后是空的,但是还是要尝试看看文件中的内容,毕竟暗示的太明显了
构建payload:?page=abc’) or system(“cat templates/flag.php”);//
访问题目网址+payload, 然后查看网页源代码的到flag
答案:cyberpeace{d67613f92f5b9db5aa431b01f1cf0d26}
Training-WWW-Robots
so easy,emmmmm
- 访问网址,查看网站的robots.txt文件,即访问http://111.198.29.45:42194/robots.txt,
- 发现了有个f10g.php不让爬虫访问,有问题,接着访问http://111.198.29.45:42194//fl0g.php
- 得到flag: cyberpeace{fa6f80fa63a1c6be3519907c459ee696}
NaNNaNNaNNaN-Batman
预备知识
eval()
JavaScript函数,会将执行字符串中的JavaScript语句。a=”javascript语句”;eval(a);
alert()
javascript函数,会将字符串的内容以弹窗的形式显示出来。当我们获取到的文件有编码问题时,一般可以通过此函数将正确的编码的形式显示出来。
题解
下载文件,使用记事本打开,发现时javascript语句,但是呢存在很多乱码。
直接修改文件的后缀名为.html,使用浏览器打开。得到了一个输入框
在此查看源代码,发现最后有一个eval()函数,应该是用来执行前面字符串变量
_
中包含的JavaScript命令。但是由于函数中存在乱码,看不出什么东西。把eval函数改为alert函数,从而将函数的内容以弹窗的形式显示出来。
乱码消失,为什么消失呢,看了网上很多的解释,我有对源码与弹窗的代码进行了对比,发现源码中的乱码所代表的是一些JavaScript的命令,如so对应if,我认为应该是浏览器的JavaScript模块特定的编码,当使用浏览器进行解析的时候可以正确的显示对应的字符,而使用普通的编辑器无法解析
复制代码,对齐进行调整一下
function $() { var e=document.getElementById("c").value; if(e.length==16) if(e.match(/^be0f23/)!=null) if(e.match(/233ac/)!=null) if(e.match(/e98aa$/)!=null) if(e.match(/c7be9/)!=null){ var t=["fl","s_a","i","e}"]; var n=["a","_h0l","n"]; var r=["g{","e","_0"]; var i=["it'","_","n"]; var s=[t,n,r,i]; for(var o=0;o<13;++o){ document.write(s[o%4][0]); s[o%4].splice(0,1) } } } document.write('<input id="c"><button onclick=$()>Ok</button>'); delete _
就是对我们输入的字符进行正则匹配,如果都成功了就输出flag。
分析匹配的条件,发现使用
be0f233ac7be98aa
刚好16个字符,^
与&
分别对应起始符和终止符不需要我们输入,也不算到长度里面。输入字符达到答案
flag{it's_a_h0le_in_0ne}
bug
预备知识
文件上传限制绕过
文件在上传时会通过客户端的JavaScript代码对文件的类型进行验证,不符合的会进行报错。
当文件上传到服务器是有时也会对文件类型进行检测,当不符合时会进行报错。
题解
打开网页,首先注册一个账号
登录之后发现有一个manage页面只有管理员能打开,尝试以管理员登录。
我们在登录界面发现了一个找回密码Findpwd页面,输入我们的信息,点击提交。
得到更改密码的页面
使用burporject拦截,发现了我们提交了用户名和新密码,尝试将用户名更改为admin
username=admin&newpwd=admin,点击放包,显示密码修改成功
以管理登录,再次点击manage页面,显示ip不被允许,那么就使用burporject修改xff为127.0.0.1。
得到返回的结果,查看页面源代码,发现了
<!-- index.php?module=filemanage&do=???-->
像是要上传文件,do=upload,访问页面。得到一个上传文件的窗口
显示我们需要上传的是图片,尝试上传一张png文件,结果显示
you know what i want
这就是在考我们的文件上传漏洞的利用了,新建一个txt文件,后缀名改为.png,文件中写入
<script language="php">php</script>
目的是告诉服务器这是一个php文件,而将后缀名改为.png是为了绕过客户端的检测
提交文件,使用burproject拦截,更改文件名的后缀为.php5,为了绕过服务器的检测,同时保证php文件可以被服务器的php服务运行,Apache服务器会将其视为php文件执行。
放包的到flag
答案:cyberpeace{e7f0b000f46130efad220c66d77e98e2}
总结
对于这种找bug的题要敢于尝试,应当对每个页面都进行审查。
upload
预备知识
mysql语句奇怪的执行顺序
select database() 显示当前操作的数据库的名称
select hex(database()) 显示当前操作的数据库的名称字符的16进制格式
mysql> select hex(database()); +-----------------+ | hex(database()) | +-----------------+ | 6C7A73716C | +-----------------+ 1 row in set (0.01 sec)
select substr(hex(database()), 1, 8) 显示当前操作的数据库的名称的16进制格式的前八位
mysql> select substr(hex(database()), 1, 8); +-------------------------------+ | substr(hex(database()), 1, 8) | +-------------------------------+ | 6C7A7371 | +-------------------------------+ 1 row in set (0.00 sec)
总结:mysql语句中关键字的优先级不一样,select database()的优先级最高,其次才是对其操作结果执行的命令,如hex, substr等
CONV
和hex,substr属于同一类,可嵌套使用,conv(N, G1, G2),将N从进制G1, 转换到进制G2。
mysql> select conv(11, 10, 16); +------------------+ | conv(11, 10, 16) | +-----------------+ | B | +------------------+ 1 row in set (0.00 sec)
题解
最开始我以为文件上传漏洞,找了半天,试了一句话木马都不行,大佬题解救我,由于过程较为冗杂,学习意义不大,在此直接放上大佬的题解。
https://www.cnblogs.com/sharpff/p/10728498.html
FlatScience
预备知识
sqlite自带的结构表sqlite_master,sql是sqlite_master中的一个字段,注入时经常用到的
union 用于将两个查询语句的结果进行合并,但是一般要求查询的列数相等
limit 可用于指定查询的其实位置和条数,比如limit 0,1 表示从0开始取一个
题解
https://blog.csdn.net/zz_Caleb/article/details/89323133
懒得写了,以后有机会再补上吧,放上我自认为别人写的比较好的题解இ௰இ
web2
这道题其实没什么弯,题目给的很明白,就是给了结果让我们来逆向算法,得到初始值
在线php环境 调用
str_rot13
进行str_rot13解码与逆序echo strrev(str_rot13("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"));
随便找个base64解码的网站进行解码
~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
python 逆向编辑函数
_ = "~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg" _o = "" while len(_): _c = _[-1] _ = _[:-1] __ = ord(_c) _c = chr(__ -1) _o += _c print(_o)
的到flag:flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
PHP2
预备知识
urldecode():对已经过url编码的字符串进行解码
常见利用:%2561,首先浏览器一般对其进行解码再传送给服务器%25解码得到%,于是乎传送给服务器的就是%61,服务器端再次利用urldecode()进行解码得到a。可以通过此种方式绕过一些判断。
题解
得到链接,我从下手,看看robots.txt, .git, 没什么发现
尝试url+index.php,得到原来的网页,证明我们访问的就是index.php页面,之不过默认不指出index页面。
题目是php2,尝试url+index.php2,无果,尝试url+index.phps,返回源码(菜鸡的我又被虐到了)
<?php if("admin"===$_GET[id]) { echo("<p>not allowed!</p>"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "<p>Access granted!</p>"; echo "<p>Key: xxxxxxx </p>"; } ?> Can you anthenticate to this website?
首先要绕过第一个if,并且还有保证字符为admin,并且还利用到了urldecode()
构造payload:url+?id=%2561dmin。得到答案
http://111.198.29.45:43764/?id=%2561dmin Access granted! Key: cyberpeace{11a35d67596e61866c858c6375715e62} Can you anthenticate to this website?
看书真的有用啊,这个我在web实战中见过,还是要多读书
unserialize3
php反序列化漏洞
题解
把题目给的类进行序列化,构造payload即可
http://111.198.29.45:39720/?code=O:4:"xctf":1:{s:4:"flag";s:2:"111";}
php反序列化还是比较大的一块内容,看来要花一点时间学习一下啦
upload1
so easy
访问网址发现可以上传图片
居然还返回了一个类似地址的信息 upload/1571474485.C罗.jpg
尝试访问 http://111.198.29.45:44266/upload/1571474485.C%E7%BD%97.jpg, 居然可以,证明我们的文件的却是保存到了服务器上并且我们还可以直到在哪里。
尝试上传一句话木马, 创建txt文件写入 保存为a.php,尝试上传这个文件,结果显示让我们上传一张图片,即存在客户端检测,尝试绕过
更改文件名为a.jpg,在此上传,使用burproject拦截,修改文件名为a.php
得到返回的信息,成功上传一句话木马
使用中国菜刀连接
下载flag.php文件得到答案:cyberpeace{8bfda28e2f87c19cafc9380f62126c31}