asp.net webservice soap漏洞修复
前言
最近用户那边一直进行安全漏洞扫描,这边部署的一个老的mvc,webservice接口不幸中招,需要修复
这里记录下修复过程。
正文
漏洞详情:
1 asmx页面可以打开,接口定义全部泄露
2 接口调用可以正常调用,泄露系统线上数据
如下图:

修复过程
正对asmx页面的显示,通过web.config 配置,去掉页面显示,接口不影响
<webServices>
<protocols>
<!-- 保留必须的协议,移除 Documentation -->
<remove name="Documentation"/>
<!-- 可选:移除测试协议 Post/HttpGet -->
<remove name="HttpPost"/>
<remove name="HttpGet"/>
<!-- 保留 SOAP 协议以保证服务可用 -->
<add name="HttpSoap"/>
</protocols>
</webServices>
这样配置完毕后,asmx页面不会显示,但接口正常,用postman测试如下:

asmx页面虽然隐藏,但接口还是可以随意调用,这里通过soap 的header,将账号密码配置到header中,然后接口验证信息
这里先定义 soapheader
public class MySoapHeader:SoapHeader
{
public int UserID;
public string UserName;
}
然后asmx的后台方法获取header,再进行简单的认证
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class HelloWorld : System.Web.Services.WebService
{
public MySoapHeader mySoapHeader;
[WebMethod]
[System.Web.Services.Protocols.SoapHeader("mySoapHeader")]
public string HelloWorld1()
{
if (!Authenticate())
throw new SoapException("身份验证失败",
SoapException.ClientFaultCode,
"");
return "Hello World";
}
private bool Authenticate()
{
if (mySoapHeader == null
|| string.IsNullOrWhiteSpace(mySoapHeader.UserName) )
return false;
if(mySoapHeader.UserName!="admin")
{
return false;
}
// 实际应用中应该验证令牌的有效性
return true;
}
}
最后就是 通过postman调用进行测试
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>111</UserID>
<UserName>admin</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorld1 xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>
结尾
以上就是 soap漏洞的修复过程。

浙公网安备 33010602011771号