zoukankan      html  css  js  c++  java
  • HTTP代理实现请求报文的拦截与篡改9实现篡改功能后的演示+源码下载

    返回目录 

      前面我们用了N多的篇幅完成了拦截部分的分析 ,今天我们就开始来进行篡改部分的分析。和拦截部分一样,在开始前我们先看看软件在实现了篡改功能后的样子。这样有助于理解代码.    

       同样的,编译后的程序放在了附录的根目录下的build文件夹里,不过和前面的附录相比,这次在根目录下多出了一个testwebsite的文件夹 。这是个VS2010的WEBSITE工程(其它版本的VS运行如果出问题,请自行解决问题:) ),在VS里直接 文件(File)-->打开(Open)-->站点(Website),然后选中这个文件夹就可以导入了。导入后会发现,这个项目里除了web.config外就只有一个 Default.aspx 以及他的cs文件。我们打开Default.aspx 。

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <style>
        div.result {border:1px solid #ababab;padding:6px;background:#efefef;width:280px}
          div.result span {color:red}
      </style>
      <title></title>
    </head>
    
    <body>
      <form action="Default.aspx?id=1" method="post">
        username:<input type="text" name="username" value="<%=Request.Form["username"] %>" />
        <input type="submit" value="submit" />
      </form>
      <div class="result">
        id:<span><%=Request.QueryString["id"]%></span><br />
        username:<span><%=Request.Form["username"]%></span><br />
      </div>
    </body>
    </html>

      上面的代码非常简单,就是第一次进入后,显示如下的界面   

      然后点击submit按钮后,就会在灰色的那个方框架内显示出使用GET方法提交的id(从地址栏)以及使用Post方法提交的username值 。 

      我们后面的拦截与篡改的演示全部是基于这个页面的,所以在演示前,各位最好导入一下这个工程,当然你们的地址可能和我后面提到的不一样(这依赖于你们是如何配置的),这个问题不大,到时候你们按照你们自己的地址改就是了。反正无论如何,你们只要能把这个页面运行起来就行了。 当然你们如果嫌麻烦,也可以使用现成的网页例如 www.baidu.com 等等进行测试 。 

      好的,下面我们正式开始。先运行build文件夹下的程序,当然如果你打开了source下的源码,也可以直接在VS里运行 。 

      然后,切换到testwebsite那个工程

     

      在Default.aspx上右键--> 在浏览器中查看。 

      这时候就会在浏览器中打开这个页面了。我这边打开的地址是http://localhost:4579/testwebsite/Default.aspx 。 

      Okay ,回到程序。

      看选中的那行,OKAY,我们已经成功拦截到我们自己的这个页面了。

      下面我们就来篡改了。当然刚才那次请求已经没办法进行篡改了,因为没有下断点,所以并没有办法在转发到服务前进行中断。 

      那么如何下断点呢,很简单,在左边最下边的黑框里输入

     bpu localhost:4579/testwebsite/Default.aspx  

      

      这样当我们拦截到localhost:4579/testwebsite/Default.aspx 这个网址的时候,就会在 将请求转发到服务前中断下来,这样我们就可以在这个时候更改请求报文,然后,再将这个改过的报文继续发送到服务器,这样就实现了篡改。当然现在不明白这些也没问题,先看表象是什么样的。

       输入 bpu localhost:4579/testwebsite/Default.aspx  后。回车,这时候会发现文本框清空了,这说明断点已经下完成了 。  注 bpu 是 breakpointurl 的缩写 。 

       下完断点后,我们切换到刚才的网址(http://localhost:4579/testwebsite/Default.aspx) 。 

     

      在文本框里输入 aaa 点 submit 。  

      注:千万不要重新打开网址,否则在打开的时候就会被断下来了。  

      这时候我们会发现我们的程序弹到了最前面,或者在任务栏上闪动提示,这说明我们已经将localhost:4579/testwebsite/Default.aspx  这个地址断下来了。这时候看看程序界面

       有一栏红色背景的,看一下,正是我们的页面,红色背景说明这是被断下来的页面,然后选中红色的那一行 。 

      看右边,文本框 

    POST /testwebsite/Default.aspx?id=1 HTTP/1.1
    Host: localhost:4579
    Proxy-Connection: keep-alive
    Content-Length: 12
    Cache-Control: max-age=0
    Origin: http://localhost:4579
    User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
    Content-Type: application/x-www-form-urlencoded
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Referer: http://localhost:4579/testwebsite/Default.aspx
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
    Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
    
    username=aaa

      第一行红色的部分(id=1),这是GET提交的部分。

      再看最后一行username=aaa 这是POST提交的部分。 

      OKAY,我们把id=1 改成 id=2 username=aaa 改成 username=bbb 

      然后点击右边的  按钮 。 如果没有断点的情况下,这个按钮是灰色的。  

      OKAY,这时候再回到浏览器看一下我们页面执行的结果 

     

      看到什么了!!! 是的,已经篡改成功了。是不是有点小兴奋。

      下面我们再来看看有中文的情况下的篡改 

      bpu 一次后,我们并没有实现删除断点的功能,所以只要程序不关闭,每次刷新或者执行这个页面的时候,都会被断下来。所以现在我们直接打开我们的页面。 

      在文本框里输入 资本主义好  

      然后点击submit 。 这时候就会被再次断下来了。 

       看一下断下来时的界面 

      选中红色的行。   

    看右边

    POST /testwebsite/Default.aspx?id=1 HTTP/1.1
    Host: localhost:4579
    Proxy-Connection: keep-alive
    Content-Length: 54
    Cache-Control: max-age=0
    Origin: http://localhost:4579
    User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
    Content-Type: application/x-www-form-urlencoded
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Referer: http://localhost:4579/testwebsite/Default.aspx?id=1
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
    Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
    
    username=%E8%B5%84%E6%9C%AC%E4%B8%BB%E4%B9%89%E5%A5%BD

      这次ID我们就不管了,只看最后一行  

      username=%E8%B5%84%E6%9C%AC%E4%B8%BB%E4%B9%89%E5%A5%BD

      我们输入的是 资本主义好 。这里变成了 %E8%B5%84%E6%9C%AC%E4%B8%BB%E4%B9%89%E5%A5%BD 。 这是“资本主义好”通过urlencoder编码后的样子,HTTP请求报文里,涉及非英文字符时,都会通过这种编码方式进行传输。这种编码的原理其实很简单,就是用 %十六进制 的形式依次列出某个字符通过某种字符编码(GB2312或者UTF-8)后在内存中的实际值。当然这个不明白问题不大,我们在程序里实现了一个小工具,来实现URL编码。

      工具-->URL编码 

      在原文部分,输入“社会主义好” 。 

      有个选择编码的地方,这个要按你页面的实际进行选择。查看你的页面使用的编码格式,不同的浏览器不一样,我们这个页面使用的是UTF-8

      所以我们选择UTF-8 ,然后点击  编码  按钮      

      看密文部分,复制。    

      然后关闭这个窗口,用刚才复制的内容替换请求报文文本框里最后一行username=后面的那部分,这时候报文变成了

     

      点击运行至完成。 

      这时候看页面 

      OKAY,再一次成功篡改了。 :)      

      

     附录(源码+程序)   

  • 相关阅读:
    fread()创建文件和file_exists()文件缓存问题
    docker 常用命令(一)
    python学习资源
    python 爬虫之 selenium API
    卡方检验用于特征选择
    三种常用数据标准化方法
    oracle查看编码以及修改编码
    JAVA 泛型
    java中Class对象详解和类名.class, class.forName(), getClass()区别
    oracle 数据导入导出
  • 原文地址:https://www.cnblogs.com/jivi/p/2980464.html
Copyright © 2011-2022 走看看