ASP.NET审计小技巧(三)之参数可控&sql注入

xiao1star2025-08-07文章来源:SecHub网络安全社区


.NET审计之参数可控以及sql注入

参数可控

总所周知,只有参数可控了我们才能传递一些危险数据进而利用漏洞,那么在.NET中有哪些参数可控的方式呢,

1.Request方法

类似于java的Resquest获取前端参数

base.Request["可控参数"] //除了这个种还有类似的反正都有Resquest的字眼

20250630104957004.png

这个登录页前端传递过来的参数分别为type、loginCode、pwd

20250630103131389.png

可以看到我们的代码,通过base.Reqeust方法对type、loginCode、pwd进行非空判断,然后对loginCode、pwd进行base64编码

20250630103440826.png

2.通过Form的形式

例如前端的通过表单来传递数据,使用[Fromform]特征来接收参数

<form action="/api/values" method="post">
    <input type="text" name="name" value="Kimi" />
    <input type="number" name="age" value="25" />
    <button type="submit">Submit</button>
</form>
[HttpPost] public IActionResult Post([FromForm] string name, [FromForm] int age) { return Ok(new { Name = name, Age = age }); }

如果前端通过 AJAX 或其他方式发送 JSON 数据,可以使用 [FromBody] 特性来接收参数

fetch('/api/values', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'xiao1star', age: 25 }) });
[HttpPost] public IActionResult Post([FromBody] dynamic data) { string name = data.name;//从前端接收name、age参数 int age = data.age; return Ok(new { Name = name, Age = age }); }

3.利用类传参

public class User { [Required] [StringLength(50)] public string Name { get; set; } [Range(1, 100)] public int Age { get; set; } } [HttpPost] public IActionResult Post(User user) { if (!ModelState.IsValid) { return BadRequest(ModelState); } return Ok(new { Name = user.Name, Age = user.Age }); }

4…通过路由的形式

[HttpGet("{name}/{age}")] public IActionResult Get(string name, int age) { return Ok(new { Name = name, Age = age }); }

总结

其实.NET中参数可控有着各种各样的变形,但是就这差不多都是类似于这些形式

sql注入

其实sql注入,我们主要需要看看在.NET中有哪些预编译的东西,如果不是预编译的话一般就是直接拼接的形式然后在判断是否参数可控即可

sql预编译

1.:拼接

select * from user where id=:id

2.?拼接

select * from user where id=?

3.@拼接

select * from user where id=@id

碰到上面三种直接say good bye即可

如下图所示我们这个sql语句是直接拼接的,若这个AskID可控即可造成sql注入

202408281622647.png