如何解决单参数Web方法中的API批量赋值?

问题描述 投票:0回答:1

我正在 Visual Studio 2012 中从事网站项目。这里我有一个采用单个参数的 Web 方法。该方法由

AutoCompleteExtender
控件调用。下面是它的代码:

<asp:TextBox ID="txtsearch" runat="server" CssClass="form-control setvaluework" MaxLength="4000" />
   <ajx:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txtsearch" ServicePath="SearchWebService.asmx" ServiceMethod="GetWorsList"
   MinimumPrefixLength="1" CompletionSetCount="20" CompletionInterval="0" EnableCaching="true"  CompletionListElementID="autocompleteList" >
</ajx:AutoCompleteExtender>`

“GetWorsList”定义如下:

[WebMethod]
public List<string> GetWorsList(string prefixText)
{
    List<string> workNames = null;
    if (Validations.ValidWorkNoAjax(prefixText) == false)
    {
        return workNames;
    }
    else
    {
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }

        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
        cmd.Parameters.Add("@prefixText", SqlDbType.VarChar, 500).Value = "%" + prefixText + "%";

        /*Some Code*/

        return workNames;
     }
}

我正在努力保护此方法免受

API Mass Assignment
的侵害。在审核扫描中,此方法被利用。在测试扫描中发出 POST 请求时,使用了以下有效负载:

{
 "prefixText": "WL",
 "count": 20,
 "is_admin": true,
 "is_sso": true,
 "role": "admin"
}

并且它返回 200 OK 状态,这不应该是这种情况,因为函数只接受单个输入作为

prefixText

我对此进行了搜索,发现我必须

避免使用自动将客户端输入绑定到代码变量或内部对象的函数。如果适用,请显式定义并强制执行输入数据有效负载的架构。

为了实现这一目标,我尝试了以下方法:

public object GetWorsList(string prefixText)
{
    var requestStrings = HttpContext.Current.Request.QueryString;

    foreach (var item in requestStrings.AllKeys)
    {
        if (!item.Contains("prefixText") && !item.Contains("count"))
        {
           return BadRequest("Invalid Request");
        }
    }
}

我创建了一个将被接受的参数白名单。如果攻击者添加任何其他参数,则此方法将返回

BadRequest
。但同样在 POST 请求中,此方法不起作用,即我没有得到
BadRequest
。我使用以下详细信息在邮递员中对此进行了测试:

POST 请求中的

http://localhost:6949/ewbms_bb/SearchWebService.asmx/GetWorsList
我发送的有效负载是:

{
 "prefixText": "WL",
 "count": 20,
 "is_admin": true,
 "is_sso": true,
 "role": "admin"
}

使用上述有效负载,该方法应返回

BadRequest
,但它给出状态代码
200 OK

我还尝试创建一个单独的类,如下所示:

public class WorkSearchModel 
{
    public string prefixText { get; set; }
    public int Count { get; set; }
}

并使用

WorkSearchModel
作为我的方法参数。当我使用邮递员以及本地主机进行测试时,我收到错误:
There was an error processing the request.

通过我在互联网上的搜索,我发现“API批量分配”在Asp.Net Core中得到了正确处理,但在webform/website项目中我没有发现这样的结果。请大家指导一下。

c# asp.net security webforms penetration-testing
1个回答
0
投票

您能找到解决这个问题的方法吗?我也面临同样的情况。请指教

© www.soinside.com 2019 - 2024. All rights reserved.