在接触脚本之前,我们要先克服我们心里的障碍。新手时,我们会了sql注入,xss等原理,会了许多工具的使用,
同时我们也可以对网站进行一些简单的尝试,但是每当一说脚本时,我们都会觉得好高级,好难的样子。这是我们首先需要克服的。
其实脚本的编写没有那么难,当你尝试过后,就会发现一个漏洞,重要的是漏洞的原理,如何利用,当你理解后,脚本就会很顺利的编写出来
编写脚本之前我们需要准备什么
相信对于很多新手来说,都比较好奇我的语言基础差可以编写吗,我要达到什么程度才可以编写脚本。这里我将我的经验分享给大家:
1.语言基础差也可以编写脚本的。
2.只要你能认识到基础的语法,结构,就可以开始编写了。
当然你编写的速度和质量可能不如别人的,但是总是要不断尝试才能编写的更
好吧。对语言学习不是很多的,遇到自己处理不了的,都去查一查解决办法,
总是能成功的,同样也在不断的练习中加强了自己的语言的基础学习
编写脚本最重要的是什么
要解决一个问题,我们首先要明白这个问题的原理是什么,然后再去解决。也就是说,对于一个漏洞你得明白他的原理,然后将脚本当作实现他的工具。
可能解释的比较抽象,下面我通过举例来说明
尝试编写脚本
这里我以攻防世界web题get_post这道题举例,
访问url,题目告诉我们要上传一个a=1的变量,相信大家不用编写脚本都可以写这道题。
(这里以python为例)既然要用脚本,那么我们首先要想到应该用什么上传对吧。requests库中的get函数,如下:
import requests
url = "http://61.147.171.105:53163/?a=1"
result = requests.get(url)#构造请求
result.encoding=result.apparent_encoding#这个是为了得到的内容不会乱码
print(result.text)#输出我们的结果,因为得到的是html,要先转化为文档输出。
这里我们就完成了一个简单的脚本,得到结果:
这里可以看到我们还要在刚刚的基础上用post上传一个b=2的变量
于是我们在刚刚脚本的上修改:
import requests
url = "http://61.147.171.105:53163/?a=1"
requ = requests.session()#该函数是保持一个会话
#因为是继续上传,所以两次上传必须保持是同一个cookie
result = requ.get(url)
data = {
"b" : 2
}#因为我们要用post上传数据,再根据post的用法,将数据放在data中
result2 = requ.post(url,data=data)#使用post上传
result2.encoding=result2.apparent_encoding
print(result2.text)#将结果输出
到这里我们就完成了这道题的脚本的编写,你是不是发现原来编写脚本并不是那么难,对于新手来说,也是完全可以上手的,只不过在函数的使用上可能会比较麻烦,但是可以通过查资料完成,同样你下次再编写的时候就会知道该如何。
会了简单脚本又该如何更近一步呢
看完上面相信你已经知道简单的脚本怎么编写了,那么对于难一点的题目我们应该怎么办呢
这里我们还是要首先摆脱一个误区:
不是脚本的好坏决定结果,而是原理的理解决定结果
当我们拿到一个漏洞,第一步是去分析漏洞原理,我们应该怎么利用。只有知道怎么利用,我们才能使用工具或者编写脚本。
比如在sql盲注时,原理是我们注入时如果结果正确就会返回正常。那么一个一个试是不是很麻烦,于是我们通过循环先注入,然后通过返回状态判断,比如:
if response.status_code != 200:
self.result.status = False
return
又或者sql延迟注入时,我们需要通过返回结果的时间来判断,这个时候就需要来找到能够判断时间的函数time。
总结:综上,就是我们需要对漏洞原理有一个深刻的理解,然后掌握相关的函数,就可以写出来复杂的脚本了
新手可以从这些库入手
requests:里面包含了get请求,post请求,ression()保持会话等
lxml的etree:可以将text转化为html,利于对一些要在页面中查询信息的
可以通过xpath来进行路径的搜索
然后再就是一些函数的使用,主要是明白函数的类型,处理对象的数据结构,