前言

在开始本文之前,先来介绍一下相关内容,大家都知道一些防护SSRF漏洞的代码一般使用正则来判断访问IP是否为内部IP,比如下面这段网上比较常见的正则:
if re.match(r"^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$", ip_address) or \
re.match(r"^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$", ip_address) or \
re.match(r"^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$", ip_address):
raise Execption("inner ip")
很明显这个正则有很多问题,可以有多种方式绕过,比如
1. 利用八进制IP地址绕过
2. 利用十六进制IP地址绕过
3. 利用十进制的IP地址绕过
4. 各种进制组合形成的IP绕过
一般我们常见都是10进制表示的IP,其实系统是可以识别其他进制表示的IP,比如8进制,16进制,或者它们的组合,更多详情可以参考:总结一些你可能不知道的ip地址
所以,我们在测试系统是否有SSRF漏洞的时候,有时候需要尝试各种进制的IP组合,看看是否能绕过系统的防护,于是就有了本文的这个小程序,用于自动生成各种进制形式的IP,以帮助我们进行安全测试,下面话不多说了,来一起看看详细的介绍:
实例源码
程序代码
#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
各种进制的IP表示及其它们的组合
"""
import socket
import struct
import itertools
def ip_split_by_comma_oct(ip):
"""
:param ip:
:return:
"""
parsed_result = set()
ip_split = str(ip).split('.')
ip_split_oct = [oct(int(_)) for _ in ip_split]
parsed_result.add('.'.join(ip_split_oct))
return parsed_result
def ip_split_by_comma_hex(ip):
"""
:param ip:
:return:
"""
parsed_result = set()
ip_split = str(ip).split('.')
ip_split_hex = [hex(int(_)) for _ in ip_split]
parsed_result.add('.'.join(ip_split_hex))
return parsed_result
def combination_oct_int_ip(ip):
"""
:param ip:
:return:
"""
result = set()
parsed_result = set()
ip_split = str(ip).split('.')
oct_2 = list(itertools.combinations([0, 1, 2, 3], 2))
oct_3 = list(itertools.combinations([0, 1, 2, 3], 3))
for n, _ in enumerate(ip_split):
_tmp = oct(int(_))
_delete = ip_split[:n] + ip_split[n+1:]
_delete.insert(n, _tmp)
result.add(tuple(_delete))
for _ in oct_2:
_tmp_ip = ip_split[:]
_tmp1 = oct(int(ip_split[_[0]]))
_tmp2 = oct(int(ip_split[_[1]]))
del _tmp_ip[_[0]]
del _tmp_ip[_[1] - 1]
_tmp_ip.insert(_[0], _tmp1)
_tmp_ip.insert(_[1], _tmp2)
result.add(tuple(_tmp_ip))
for _ in oct_3:
_tmp_ip = ip_split[:]
_tmp1 = oct(int(ip_split[_[0]]))
_tmp2 = oct(int(ip_split[_[1]]))
_tmp3 = oct(int(ip_split[_[2]]))
del _tmp_ip[_[0]]
del _tmp_ip[_[1] - 1]
del _tmp_ip[_[2] - 2]
_tmp_ip.insert(_[0], _tmp1)
_tmp_ip.insert(_[1], _tmp2)
_tmp_ip.insert(_[2], _tmp3)
result.add(tuple(_tmp_ip))
for _ in result:
parsed_result.add('.'.join(_))
return parsed_result
def combination_hex_int_ip(ip):
"""
:param ip:
:return:
"""
result = set()
parsed_result = set()
ip_split = str(ip).split('.')
hex_2 = list(itertools.combinations([0, 1, 2, 3], 2))
hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
for n, _ in enumerate(ip_split):
_tmp = hex(int(_))
_delete = ip_split[:n] + ip_split[n+1:]
_delete.insert(n, _tmp)
result.add(tuple(_delete))
for _ in hex_2:
_tmp_ip = ip_split[:]
_tmp1 = hex(int(ip_split[_[0]]))
_tmp2 = hex(int(ip_split[_[1]]))
del _tmp_ip[_[0]]
del _tmp_ip[_[1] - 1]
_tmp_ip.insert(_[0], _tmp1)
_tmp_ip.insert(_[1], _tmp2)
result.add(tuple(_tmp_ip))
for _ in hex_3:
_tmp_ip = ip_split[:]
_tmp1 = hex(int(ip_split[_[0]]))
_tmp2 = hex(int(ip_split[_[1]]))
_tmp3 = hex(int(ip_split[_[2]]))
del _tmp_ip[_[0]]
del _tmp_ip[_[1] - 1]
del _tmp_ip[_[2] - 2]
_tmp_ip.insert(_[0], _tmp1)
_tmp_ip.insert(_[1], _tmp2)
_tmp_ip.insert(_[2], _tmp3)
result.add(tuple(_tmp_ip))
for _ in result:
parsed_result.add('.'.join(_))
return parsed_result
def combination_hex_int_oct_ip(ip):
"""
:param ip:
:return:
"""
result = set()
parsed_result = set()
ip_split = str(ip).split('.')
hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
for n1, n2, n3 in hex_3:
_tmp_ip = ip_split[:]
_tmp_2 = oct(int(_tmp_ip[n2]))
_tmp_3 = hex(int(_tmp_ip[n3]))
del _tmp_ip[n2]
del _tmp_ip[n3 - 1]
_tmp_ip.insert(n2, _tmp_2)
_tmp_ip.insert(n3, _tmp_3)
result.add(tuple(_tmp_ip))
for _ in result:
parsed_result.add('.'.join(_))
return parsed_result
if __name__ == '__main__':
ip = '10.1.100.1'
ip_int = struct.unpack('!L', socket.inet_aton(ip))[0]
ip_oct_no_comma = oct(ip_int)
ip_hex_no_comma = hex(ip_int)
ip_oct_by_comma = ip_split_by_comma_oct(ip)
ip_hex_by_comma = ip_split_by_comma_hex(ip)
all_result = ip_oct_by_comma | ip_hex_by_comma | combination_oct_int_ip(ip) | combination_hex_int_ip(ip) | combination_hex_int_oct_ip(ip)
for _ip in all_result:
print _ip
代码很容易看懂,首先生成纯8进制表示的IP、纯16进制表示的IP,然后在分别生成10进制和8进制混合组成的IP,16进制和10进制混合组成的IP, 16进制8进制10进制混合组成的IP,最后输出各种组合的结果
在使用其他脚本或者工具遍历测试这个脚本的结果,看看是否能绕过SSRF的防护
部分截图:
比如生成10.1.100.1 这个IP的其他各种进制形式:
总结
工具虽然简单,但却能给我们的渗透测试带来方便,其实工作中有很多可以总结沉淀的地方,都可以形成工具化,不仅能方便以后工作,还能有助于我们知识的沉淀,加快我们自身实力提升。也希望大家以后也能多多分享。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# ip地址转16进制工具
# ip地址二进制转换工具
# ip地址格式转换工具
# java实现ip地址与十进制数相互转换
# PHP中将ip地址转成十进制数的两种实用方法
# 纯真IP数据库的应用 IP地址转化成十进制
# PowerShell把IP地址转换成二进制的方法
# 是否能
# 都是
# 好了
# 相关内容
# 大家都
# 有很多
# 说了
# 还能
# 也能
# 遍历
# 不多
# 中有
# 很容易
# 这段
# 但却
# 你可
# 希望大家
# 这篇文章
# 能给
# 很明显
相关文章:
网站图片在线制作软件,怎么在图片上做链接?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
大连网站制作公司哪家好一点,大连买房网站哪个好?
网站制作公司排行榜,抖音怎样做个人官方网站
北京企业网站设计制作公司,北京铁路集团官方网站?
山东云建站价格为何差异显著?
网站制作话术技巧,网站推广做的好怎么话术?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何高效搭建专业期货交易平台网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
焦点电影公司作品,电影焦点结局是什么?
html制作网站的步骤有哪些,iapp如何添加网页?
宝塔面板创建网站无法访问?如何快速排查修复?
如何用低价快速搭建高质量网站?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在Golang中指定模块版本_使用go.mod控制版本号
建设网站制作价格,怎样建立自己的公司网站?
建站之星CMS五站合一模板配置与SEO优化指南
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何打造高效商业网站?建站目的决定转化率
如何选择高效响应式自助建站源码系统?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何快速搭建高效WAP手机网站吸引移动用户?
如何快速搭建虚拟主机网站?新手必看指南
视频网站app制作软件,有什么好的视频聊天网站或者软件?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
个人网站制作流程图片大全,个人网站如何注销?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
家庭建站与云服务器建站,如何选择更优?
电商平台网站制作流程,电商网站如何制作?
网站制作壁纸教程视频,电脑壁纸网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
如何零基础开发自助建站系统?完整教程解析
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何用腾讯建站主机快速创建免费网站?
linux top下的 minerd 木马清除方法
如何选择香港主机高效搭建外贸独立站?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
网站代码制作软件有哪些,如何生成自己网站的代码?
宝塔建站无法访问?如何排查配置与端口问题?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
智能起名网站制作软件有哪些,制作logo的软件?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星Pro快速搭建教程:模板选择与功能配置指南
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
*请认真填写需求信息,我们会在24小时内与您取得联系。