因为上次看见有人想要分析所以就写了大概粗略版(很多代码解读直接跳过),懂点代码应该能够看懂...
PageAdmin2.0通用注入分析
通过aspx得知调用pageadmin中的data_post函数,因为.net网站开发完成后都会进行编译封装所以我们需要通过反编译得到源代码后才能够进行审计,我这里使用的dnSpy
以上为反编译后的代码但可以发现代码是被进行类似php的goto混淆的所以我们需要清晰的阅读还要进行解混淆
以上为解混淆后,代码阅读起来就方便很多多了。
private void mebUNWK5He()
{
for (;;)
{
IL_25D:
string text = base.Request.ServerVariables["SERVER_NAME"];
for (;;)
{
IL_24D:
if (this.pWeUtqyYae == null)
{
this.Oo0UMnX45s.Close();
data_post.EIs7kx18wrjWMNankX8(data_post.OGLaHy1lgxuB4MxhWyf(this), "Invalid Submit");
base.Response.End();
goto IL_215;
}
data_post.vUq5hL1snoGJfUAwAnJ();
if (!data_post.CHj3Cj1NcP23x1yXyQb())
{
goto IL_1A1;
}
string text2;
for (;;)
{
IL_187:
text2 = text2.ToLower();
if (text2.IndexOf("[k]") < 0 || text2.IndexOf(" ") >= 0 || text2.IndexOf("update") >= 0 || data_post.F6eD3q15tB8gDWCP84Y(text2, "'") >= 0 || text2.IndexOf("delete") >= 0 || text2.IndexOf("from") >= 0)
{
return;
}
text2 = text2.Replace("[k]", " ").Replace("[d]", this.qsfUOSn9Od("fLFF8NDDhNAAcJFFsIAAfKDD")).Replace("[u]", this.qsfUOSn9Od("tIAAsMAAfLCCaLFFpNDD9MCC")).Replace("[f]", this.qsfUOSn9Od("fJAAqIAAkLFFlIEE")).Replace("[s]", this.qsfUOSn9Od("qJAAeLDDpNFF"));
OleDbCommand oleDbCommand = new OleDbCommand(text2, this.Oo0UMnX45s);
oleDbCommand.ExecuteNonQuery();
int num = 7;
if (data_post.vUq5hL1snoGJfUAwAnJ())
{
switch (num)
{
case 0:
goto IL_24D;
case 1:
case 4:
continue;
case 2:
case 3:
goto IL_1A1;
case 6:
goto IL_25D;
}
return;
}
return;
}
IL_215:
if (text.ToLower().IndexOf(this.qsfUOSn9Od("tNEE8JCCeJDD9MAAdMEE8MDDkJBBgJCCmIBB")) >= 0)
{
return;
}
text2 = base.Request.Form["thedata"];
if (!string.IsNullOrEmpty(text2) && this.pWeUtqyYae.IndexOf(this.qsfUOSn9Od("pJAA8JBBeJEEdIDD9ICCfLFFkJAAgJCClLCC2NCCeNDDlIBBvMDD")) > 0)
{
goto IL_187;
}
return;
IL_1A1:
if (this.pWeUtqyYae.Replace("http://", "").Split(new char[]
{
'/'
})[0].Split(new char[]
{
':'
})[0] != text)
{
this.Oo0UMnX45s.Close();
base.Response.Write("Invalid Submit");
base.Response.End();
goto IL_215;
}
goto IL_215;
}
}
}
以上为漏洞代码的函数
核心漏洞部分在于,text2为我们可控输入的内容,indexOf是搜索是否存在xx内容,我们可以看引用了多个 Replace 来替换来自 qsfUOSn9Od 函数的内容,我们看看 qsfUOSn9Od 是什么
private string method_8(string string_10)
{
string text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
string result;
if (string.IsNullOrEmpty(string_10))
{
result = "";
}
else
{
try
{
int num = 0;
int length = text.Length;
byte[] array = new byte[string_10.Length / 2];
for (int i = 0; i < string_10.Length; i += 2)
{
int num2 = text.IndexOf(string_10[i]);
int num3 = text.IndexOf(string_10[i + 1]);
int num4 = num3 / 8;
num3 -= num4 * 8;
array[num] = (byte)(num4 * length + num2);
array[num] = (byte)((int)array[num] ^ num3);
num++;
}
result = Encoding.Unicode.GetString(array);
}
catch
{
result = "";
}
}
return result;
}
以上为函数内容代码,因为.net功底原因无法详细说出具体点但这就是一个自写解密函数。
然后结合以上漏洞代码,[d]为delete [s]为select [u]为update [k]为空格
替换完成后直接进行了SQL执行