P牛口令红包题目_TRICK

0x03 FILTER_VALIDATE_EMAIL 绕过

这就是今天第一个trick。这个点早在当初PHPMailer的CVE-2016-10033就提到过。

RFC 3696规定,邮箱地址分为local part和domain part两部分。local part中包含特殊字符,需要如下处理:

  1. 将特殊字符用\转义,如Joe\'Blow@example.com
  2. 或将local part包裹在双引号中,如"Joe'Blow"@example.com
  3. local part长度不超过64个字符

虽然PHP没有完全按照RFC 3696进行检测,但支持上述第2种写法。所以,我们可以利用之绕过FILTER_VALIDATE_EMAIL的检测。

因为代码中邮箱是用户名、@、Host三者拼接而成,但用户名是经过了转义的,所以单引号只能放在Host中。我们可以传入用户名为",Host为aaa'"@example.com,最后拼接出来的邮箱为"@aaa'"@example.com

这个邮箱是合法的:

这个邮箱包含单引号,将闭合SQL语句中原本的单引号,造成SQL注入漏洞。

0x04 绕过 Nginx Host 限制

这是今天第二个trick。

我们尝试向目标注册页面发送刚才构造好的用户名和Host:

直接显示404,似乎并没有进入PHP的处理过程。

这就回到问题的本质了,Host头究竟是做什么的?

众所周知,如果我们在浏览器里输入http://2018.mhz.pw,浏览器将先请求DNS服务器,获取到目标服务器的IP地址,之后的TCP通信将和域名没有关系。那么,如果一个服务器上有多个网站,那么Nginx在接收到HTTP包后,将如何区分?

这就是Host的作用:用来区分用户访问的究竟是哪个网站(在Nginx中就是Server块)。

如果Nginx发现我们传入的Host找不到对应的Server块,将会发送给默认的Server块,也就是我们通过IP地址直接访问的那个Nginx默认页面:

默认网站并没有/main/register这个请求的处理方法,所以自然会返回404。

这里给出解决这个问题的两个方法,也许还有更多新方法我没有想到,欢迎补充。

法1

Nginx在处理Host的时候,会将Host用冒号分割成hostname和port,port部分被丢弃。所以,我们可以设置Host的值为2018.mhz.pw:xxx'"@example.com,这样就能访问到目标Server块

如上图,成功触发SQL报错。

法2

当我们传入两个Host头的时候,Nginx将以第一个为准,而PHP-FPM将以第二个为准。

也就是说,如果我传入:

Host: 2018.mhz.pw
Host: xxx'"@example.com

Nginx将认为Host为2018.mhz.pw,并交给目标Server块处理;但PHP中使用$_SERVER['HTTP_HOST']取到的值却是xxx'"@example.com。这样也可以绕过:

这个方法我以前在某群里提到过,只有Nginx+PHP会出现这个问题,Apache的情况下将会是另一个样子,此处不展开讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import csv import matplotlib.pylab as plt import numpy as np #导入csv文件 file = 'D:\\education.csv' with open(file, encoding='utf_8', newline='') as f: data = [row for row in csv.DictReader(f)] print(data) f.close() #可视化操作 plt.rcParams["font.family"]="FangSong" #设置字体 #设置横坐标 x_trick=[] for dct in data: x_trick.append(dct.get("地区")) #设置纵坐标 #小学 y_num1=[] for n1 in data: y_num1.append(n1.get('小学')) y1 = [int(x) for x in y_num1] #初中 y_num2 = [] for n2 in data: y_num2.append(n2.get('初中')) y2 = [int(x) for x in y_num2] #高中 y_num3 = [] for n3 in data: y_num3.append(n3.get('初中')) y3 = [int(x) for x in y_num3] #大学 y_num4 = [] for n4 in data: y_num4.append(n4.get('初中')) y4 = [int(x) for x in y_num4] #无学历 count = [i+j+m+n for i,j,m,n in zip(y1, y2, y3, y4)] y0 = [100000 - i for i in count] plt.figure(figsize=(10,5)) #设置表格大小 plt.title('各地区每10完人不同教育程度的人数', loc='left', fontsize=10) x=range(0,len(x_trick)) #刻度 plt.xticks(x,x_trick) #横坐标对应位置显示的内容 #在特定的起始高度画出每条对应的柱子,并给定相应的颜色 plt.bar(x,y0,color='rad') plt.bar(x,y1, color='orange', bottom=np.array(y0)) plt.bar(x, y2, color='yellow', bottom=np.array(y0)+np.array(y1)) plt.bar(x, y3, color='green', bottom=np.array(y0)+np.array(y1)+np.array(y2)) plt.bar(x, y4, color='blue', bottom=np.array(y0)+np.array(y1)+np.array(y2)+np.array(y3)) #创建图例 plt.legend(['五', '小学', '初中', '高中(含中专)', '大学(大专及以上)'], ncol=5,bbox_to_anchor=(1.001,1.054), borderaxespad=0, fontsize=6, loc=1, ) plt.show() 请修改这段代码
最新发布
06-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值