首页
社区
课程
招聘
[原创]用世界上最好的语言开发自动化注入工具
发表于: 2020-2-4 20:43 1525

[原创]用世界上最好的语言开发自动化注入工具

2020-2-4 20:43
1525

本文使用世界上最好的语言(PHP)针对某h站系统而开发的自动化注入工具。

首先来明确工具开发中的几个点:

1、正常页面和错误页面的区别

2、该工具自动化判断表名以及表中字段的数据长度

3、使用缓存机制(读取和写入)

4、使用php cli(命令行)模式

这里可能会有人疑问了“为啥使用php?不使用python”,因为这个注入点比较特殊,是一个302页面跳转处的注入,从数据库中查询到某个域名后会输出到页面,然后跳转,否则查询不到某个域名的情况下造成死循环,输出页面的代码如下:

<script language="javascript" type="text/javascript">

document.write('<a href="http://www.52six.xyz"></a>');

go.click();

</script>

Href参数有值的情况下为正常,否则异常

<script language="javascript" type="text/javascript">

document.write('<a href=""></a>');

go.click();

</script>

异常之后就会存在死循环,因为href都为空了。

这里因为是302页面,python获取不到页面内容,而php则可以获取到内容,或许是我不擅长使用python,对php情有独钟的原因吧!

对于工具开发,必不可少的是http请求函数,php现成的有file_get_contents,相对来说,这个系统函数并不好用,因为请求不到的使用就会产生异常,当然我们不希望程序运行中突然出现异常就被中断了,然而我们要用的curl函数,下面将curl封装了一个函数:


 

我们先来测试一下,主要我们还是要测试是否能获取到302页面的内容,代码如下:


 

获取到的内容如下:


 

我使用-----------------------------------------------将正确页面和错误页面分割开来,href参数中有值的是正常页面,否则为异常页面

我们接着往下,因为现在大多数自动化工具都是采用接收命令行参数的方式,比如SQLMAP:

Python sqlmap.py -u “” --batch --dbms “”

也就是这样的,我们也采用这样的方式吧!下面我们来具体的实现:

Php cli模式接收命令行参数的超全局数组为$argv


 


 

首先我们要想到如何实现-u啊这些的,所以这里我们还是将获取的东西封装并且命名为GetHostId,在这个函数中我们不需要参数,我们需要获取全局变量可以使用两种形式$GLOBALS和global $argv


 


 


 


 

这里我们还是使用$GLOBALS的方式获取,因为我们最后会将这些函数封装在一个类里面,这样更加灵活,好了,我们继续吧!

根据上图我们可以知道,数组下标为0的数值是无用的,所以我们需要删掉$GLOBALS[“argv”][0]


 

这里第一行就将下标为0的值删掉了,因为第1个就是执行的文件名,所以直接删掉,然后进行赋值,我们接着往下来,我们命令行中需要两个参数一个为--host或者-h,另一个为--id,函数已封装完毕


 

这里我们当前文件接收命令行参数就有了两种形式:


 

程序这样做了以后就显得不灵活了,因为这里的位置不能随意调换就比较懊恼,那么我们再封装一个函数


 


 

这样获取命令行参数就可以不分先后顺序了!!这里已经获取到了域名以及id,我们继续往下,获取到域名以及id过后,我们还需要另一个参数--batch,如果这个参数存在那么我们默认使用http,否则则在命令行中获取,已将获取这部分封装成了函数:


 

GetInput函数是获取命令行中的值,而GetHttp是调用GetInput获取用户输入的是https还是http协议


 

这里获取到http或者https协议拼接到host后,我们将拼接的值进行存活的判断,我们此时封装一个is_survival函数,存活返回true,否则false,判断存活本应判断状态码,但是判断状态码又不是很严格,这里我们使用正则表达式来进行匹配,返回值如下:


 

我们正则所匹配的东西应该是href中的值,那么我们的正则表达式如下:

/href=”(.+)”/i

以上就是判断存活的必要条件,我们继续:


 

这里存活条件为href中有值的情况下存活,否则是死亡状态,死亡状态有两种情况,一种是无法访问或者输入的id值不正确,我们接着往下走


 


 

查询不到内容的时候!


 

这个函数中同时会自动测试五次,若五次过后依然获取不到那么自动退出,这里我们验证了是否存活,接着我们从字典中获取表名,然后测试取出的表是否存在,那么我们在本地创建一个dictionary目录,并且写入一个名为tables.txt的字典文件:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2020-2-5 18:15
3
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2020-3-17 23:17
0
游客
登录 | 注册 方可回帖
返回
//