GobySec
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
在上一篇中,我们已经介绍了Goby PoC模板的基础构成,但是遇到更加复杂型的漏洞,需要用到一些特殊参数和自定义变量。
入门篇传送门:Goby自定义编写EXP入门篇:编写模板基础使用讲解
今天,我们以 SQL注入漏洞类型为例,讲解一些基础参数和变量的用法。
进阶篇:Goby PoC/EXP编写中的参数及自定义变量用法
首先,我们拿到一个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":[]}}
扫描测试模块(PoC)
在漏洞扫面测试模块中,逻辑上分为两个步骤:
1.发送数据包
2.检测返回包中是否存在某特征来确定是否存在漏洞。
先捋一下思路:
需要在请求包中构造一个SQL注入语句,让测试目标网站进行响应(响应的内容需要证明SQL能够注入)。我们可以在请求包中执行一串8位数的随机数并进行MD5加密,需要判断响应包中是否返回了这条语句结果,来检测测试网站是否存在注入漏洞。
清晰检测逻辑后,返回到Goby的PoC编写页面:
首先需要定义两个全局变量,以实现”生成随机8位数“和”MD5加密“。
这里四个输入项分别代表:# 变量名称、值、源值、操作/类型
那么,这两条变量定义分别表示
1、给rand_int赋值一个变量1{{{rand|int|8}}}。在Goby的json编写规约中:rand表示随机生成大小写字符串或者纯数字,int表示随机生成的为数字(若需生成字符串则定义为str),8表示数量。
2、把{{{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,则还需要增加一个output自定义变量(若在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,发送暗号“加群”),一起交流、生活趣事、奇闻八卦,结交无数好友~
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)