Goby自定义编写EXP进阶篇:以SQL注入为例的高阶变量用法讲解
Goby自定义编写EXP进阶篇:以SQL注入为例的高阶变量用法讲解
在上一篇中,我们已经介绍了Goby PoC模板的基础构成,但是遇到更加复杂型的漏洞,需要用到一些特殊参数和自定义变量。
*入门篇传送门:Goby自定义编写EXP入门篇:编写模板基础使用讲解-CSDN博客*
今天,我们以 SQL注入漏洞类型为例,讲解参数和变量的使用方法。
进阶篇:Goby PoC编写中的参数及自定义变量用法
首先,我们拿到一个SQL注入类型漏洞的请求包和响应包信息(以“JeecgBoot onlDragDatasetHead/getTotalData SQL注入漏洞”为例)
POST /jeecg-boot/drag/onlDragDatasetHead/getTotalData HTTP/1.1
Host:
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.75 Safari/537.36
Connection: close
Content-Type: application/json
{"tableName":"sys_user","compName":"test","condition":{"filter":{}},"config":{"assistValue":[],"assistType":[],"name":[{"fieldName":"concat(0x7e,version(),0x7e)","fieldType":"string"},{"fieldName":"id","fieldType":"string"}],"value":[{"fieldName":"id","fieldType":"1"}],"type":[]}}
扫描测试模块:
在漏洞扫面测试模块中,逻辑上分为两个步骤:
1.发送数据包
2.检测返回包中是否存在某特征来确定是否存在漏洞。
先捋一下思路:
需要在请求包中构造一个SQL注入语句,让测试目标网站进行响应(响应的内容需要证明SQL能够注入)。我们可以在请求包中执行一串8位数的随机数并进行MD5加密,需要判断响应包中是否返回了这条语句结果,来检测测试网站是否存在注入漏洞。

清晰检测逻辑后,返回到Goby的PoC编写页面:
首先需要定义两个全局变量,以实现”生成随机8位数“和”MD5加密“。
这里四个输入项分别代表:# 变量名称、值、源值、操作/类型
那么,这两条变量定义分别表示
- 给rand_int赋值一个变量1{{{rand|int|8}}}。在Goby的json编写规约中:rand表示随机生成大小写字符串或者纯数字,int表示随机生成的为数字(若需生成字符串则定义为str),8表示数量。
- 把{{{rand_int}}}作为变量2,进行md5加密操作后,赋值给rand_int_md5。

转编译到编辑器代码中展示为:

请求包:
根据上述思路,构建请求包:

把rand_int注入到请求包中发送,让测试目标服务器用MD5函数加密这串随机值,输出在响应包中。
响应测试:
在响应包中,响应码为200并且Body中有服务器加密后的MD5值则注入成功,判断漏洞存在。

输入靶场目标进行测试

利用测试模块(EXP):
利用测试模块中,一共包含两个模块:输入(EXP Params)、输出(Output)
输入(EXP Params):
首先,在漏洞信息页面,勾选Has EXP,定义EXP Params(利用输入))

定义一个名称为attackType(攻击类型),给它的值为default(默认)和custom(自定义),sqlpoint(输出请求包),模式为select,最后一个框默认为show,这里表示在图形化界面显示一个名称叫attackType的下拉列表,有default、custom和sqlpoint为它的三个选项。

default:默认值设置为“select database(),select version(),select user()”,以英文逗号隔开,模式设置为select。
在图型化界面中表示名称叫Default的下拉列表,提供三个默认SQL执行语句选项,分别为:查询数据库名称、查询数据库版本号、查询数据库账号。

custom设置为input,提供默认值为select database(),支持自定义输出SQL语句。

sqlpoint则代表,根据请求包内容进行输入,在注入点自动填充”*“,输出一个请求包语句,方便复制到sqlmap上进行检测。
(可根据需求自行选择是否增加此功能)

到这一步,已经了解变量用法的师傅应该清楚,此时需要在全局自定义变量中再增加一个变量,用于定义利用输入变量:设置全局自定义变量paylod,表示把在EXP Params中定义的attackType所选择的值赋值(switch))给payload且默认值为default。

输出(Output):
在SQL注入漏洞EXP测试中,我们需要构造一个能够返回执行语句结果的请求包,我们需要把想要执行的SQL语句传到注入点,发送请求包后再提取想要的输出信息。
请求包:
填写请求包对应信息,把响应测试中的请求包注入点替换为变量{{{payload}}}即可。
响应包中会包含非常多的信息,可以在{{{payload}}}变量前后添加~~~,在Output中通过正则表达式过滤掉其他多余信息即可。
在注入点构造一个SQL拼接语法:concat(0x7e7e7e,({{{payload}}}),0x7e7e7e),0x7e7e7e是”~~~“的16进制,将测试服务器对{{{payload}}}语句执行的结果用"~~~"包裹。

对应到output自定义变量,使用此正则表达式即可提取想要的执行结果

响应测试匹配响应码200即可:

若在attackType中定义了sqlpiont,则还需要增加一个自定义变量(若在attackTye模块未定义则不需要添加):
此条变量表示当attackType选择为sqlpoint时,output的信息为
{{{lastreq}}}{"tableName":"sys_user","compName":"","condition":{"filter":{}},"config":{"assistValue":[],"assistType":[],"name":[{"fieldName":"concat(*)","fieldType":"string"},{"fieldName":"id","fieldType":"string"}],"value":[{"fieldName":"id","fieldType":"1"}],"type":[]}}
变量lastreq表示最后一个请求包的请求体,表示把最后一个请求包的请求体和PostData拼接成一个完整的请求包,并把注入点替换为“*",以便复制到sqlmap进行url检测。

EXP输出测试:
成功输出select user()的执行结果。

Goby 欢迎各位师傅加入我们的社区大家庭(添加:gobyteam,发送暗号“加群”),一起交流、生活趣事、奇闻八卦,结交无数好友~

浙公网安备 33010602011771号