xiao1star2025-08-07文章来源:SecHub网络安全社区
总所周知,只有参数可控了我们才能传递一些危险数据进而利用漏洞,那么在.NET
中有哪些参数可控的方式呢,
类似于java的Resquest
获取前端参数
base.Request["可控参数"] //除了这个种还有类似的反正都有Resquest的字眼
这个登录页前端传递过来的参数分别为type、loginCode、pwd
可以看到我们的代码,通过base.Reqeust
方法对type、loginCode、pwd
进行非空判断,然后对loginCode、pwd
进行base64编码
例如前端的通过表单来传递数据,使用[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 });
}
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 });
}
[HttpGet("{name}/{age}")]
public IActionResult Get(string name, int age)
{
return Ok(new { Name = name, Age = age });
}
其实.NET
中参数可控有着各种各样的变形,但是就这差不多都是类似于这些形式
其实sql注入,我们主要需要看看在.NET
中有哪些预编译的东西,如果不是预编译的话一般就是直接拼接的形式然后在判断是否参数可控即可
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注入