安全入门之SQL注入2
一、header注入
- header注入是利用站点在获取用户请求头时未过滤用户输入进行攻击的。例如:
$uagent = $_SERVER['HTTP_USER_AGENT'];
$sql = "select * from uagents where uagent='$uagent' limit 0,1"
- 利用相关插件或者抓包工具,修改UA值,猜解白名单系统。首先使用group by语句猜解字段数,在得到字段数后使用如下代码猜解白名单。
- 对于IP、cookie属性的注入同理。
二、mssql报错注入
1.判断是否有注入点
- 在参数后面加单引号,页面报错。
- 在参数后面加 and 1=1,页面响应正常。
- 在参数后面加 and 1=2,页面数据不回显。判断该点有注入点,且id为int类型。
2.获取必要信息
- 查看系统版本号,修改参数为@@version,这里因为id的类型为int型,而@@在sql中返回的是字符串,所以它们的转换报错,从而获取版本信息。
- 判断用户是否为管理员组权限,在参数后使用is_srvrolemember
(‘sysadmin’)函数判断。该函数在用户属于管理员组权限时返回1,否则返回0.这里发现页面正常响应,说明返回值为1,是管理员组权限。
- 别的sql函数同理使用
3.获取字段
- 使用having 1=1获取第一个字段。
- 使用 group by 加 having 1=1 获取余下字段。获取title字段后,继续加入到group by中,获取下一个字段。
- 使用转换错误获取字段内容。
- 以上操作均给予页面会报错回显的条件下进行的。
三、mssql回显注入
1.判断是否有注入点
2.获取字段
- 使用order by 数字 ,来得到该表的字段数,例如在order by 5时页面正常响应,在order by 6时页面报错或无数据返回,则可判断该表有5个字段。
- 通过联合语句测试每个字段的类型。发现第1个字段为整型,第2、3、4字段为字符串类型(这3个字段位置可以替换返回值为字符串的系统函数)。
3.获取所需数据库表和内容
- 在SQL server中,每一个数据库都有一个sysobjects系统表,它存放了该数据库内创建的所有对象。所以可以查看该表获取所需数据库表,输入下面代码就可以获得该数据库第一个表了。(u表示用户表)
- 使用not in得到第二张表。同理可以获得你所需的所有表。
4.获取字段
- 系统表syscolumns中保存了当前数据库中所以的字段内容,所以可以查询该表获取所需的字段内容。
- 同理使用not in获取第后续所有字段。
- 最后获取字段内容。如下:(使用not in获取所有行内容)
四、mssql提权
- 判断用户的权限,发现页面正常响应,则该用户具有管理员组权限。若不是管理员组权限则不可提权。
- 判断数据库中是否存在xp_cmdshell。数据正常返回,该数据库中存在xp_cmdshell。
- 判断xp_cmdshell是否启用。报错,说明数据库的xp_cmdshell未启用。
- 启用xp_cmdshell。页面响应正常,启用成功
- 添加用户到管理员组。使用如下代码
exec master..xp_cmdshell "net user name password /add"
exec master..xp_cmdshell "net localgroup administrators name /add"