1. BurpSuite抓包
1.1 设置代理
burpsuite代理设置
浏览器代理设置(chrome),其他浏览器同理。
地址栏输入 chrome://settings/,
打开代理设置
设置代理端口
如果使用了代理插件,比如switchomega,可以这么设置
这样当选择使用代理选项的时候,请求包的数据也会被burpsuite拦截到。
1.2 导入证书
浏览器地址栏输入 http://burp/,如果有使用代理插件,建议先停用插件,待正确导入证书后开启使用,后续不再有影响。
点击CA Certificate,下载证书cacert.der
浏览器地址栏输入chrome://settings/
选择 “受信任的根证书颁发机构”,导入证书
下一步,选择证书,导入成功。
1.3 拦截抓包
浏览器地址栏输入地址访问,www.baidu.com
intercept is off 拦截已关闭
intercept is on 拦截已开启
可以看到请求包已经被我们拦截下来了。
选择放行Forward或者点击Intercept is on关闭拦截就会把数据包放行出去。
HTTP history中可以观察到已经拦截到的请求地址
如果有过滤的需求,可点击过滤
点击链接,会显示请求和响应等数据
下面自我发挥……
Qt发起http/https请求
1. 配置openssl
qt自身是不支持https的,如果想要使用https发起请求,要进行相关配置。
1.1 查看qt支持哪些协议
可以通过以下代码查看使用的qt版本支持哪些协议。
pro文件设置
添加network支持,QT += network
查看qt支持哪些协议
#include
#include
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
qDebug() << manager->supportedSchemes();
2 配置ssl2.1 下载openssl
http://slproweb.com/products/Win32OpenSSL.html
选择版本,就选择这个版本了
2.2 下载后直接安装,然后加入到系统环境变量(我的安装目录是D:\OpenSSL-Win32\bin)
2.3 配置qt支持https
LIBS += -L"D:/OpenSSL-Win32/lib" -llibeay32
LIBS += -L"D:/OpenSSL-Win32/lib" -lssleay32
INCLUDEPATH += $$quote(D:/OpenSSL-Win32/include)
可以测试ssl是否配置成功或者查看ssl的错误提示。
#include
qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();
2.4 编写程序这里不必要的业务逻辑就不在写了,主要放上https请求的代码,着重关注和http请求的不同点。
bool MainWindow::SendHttp() { /*QNetworkAccessManager *manager = new QNetworkAccessManager(this); qDebug() << manager->supportedSchemes();*/ qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString(); QNetworkRequest request; QSslConfiguration config; QNetworkProxy proxy; proxy.setType(QNetworkProxy::HttpProxy); proxy.setHostName("127.0.0.1"); proxy.setPort(8080); QNetworkProxy::setApplicationProxy(proxy); //url request.setUrl(QUrl(strWww)); QSslConfiguration conf = request.sslConfiguration(); config.setPeerVerifyMode(QSslSocket::VerifyNone); config.setProtocol(QSsl::TlsV1_0); request.setSslConfiguration(config); //header auto it = m_headerMap.begin(); while(it != m_headerMap.end()) { //qDebug() << it->second.m_skey.toLatin1() << it->second.m_sval.toLatin1() << '\n'; request.setRawHeader(it->second.m_skey.toLatin1(), it->second.m_sval.toLatin1()); ++it; } //nam QNetworkAccessManager qnam; qDebug() << qnam.supportedSchemes(); // 开启一个局部的事件循环,等待响应结束,退出 QEventLoop loop; QTimer timer; //发出请求 QNetworkReply *reply = qnam.get(request); QObject::connect(&qnam,SIGNAL(finished(QNetworkReply *)),&loop,SLOT(quit())); //请求结束并下载完成后,退出子事件循环 QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); //超时退出 QObject::connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit())); //超时设置5秒钟 timer.start(5000); //开启子事件循环 loop.exec(); //.... if (reply->error() == QNetworkReply::NoError) { QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if(statusCodeV.toInt() == 200 /*这里写了这个readAll(), * 下面readAll()就取不出数据了 * && !reply->readAll().isEmpty() */ ) { //写入文件 std::ofstream ofile; ofile.open("test.txt"); if(ofile.fail()) { qDebug() << "error ofile" << '\n'; } //reply->readAll().isEmpty() ofile << reply->readAll().toStdString(); ofile.flush(); ofile.close(); } } return true; }