随便注释一道sql注入题,因为过滤规则十分强大,所以难….
堆叠注入原理:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在;结束一个sql语句后继续构造下一条语句会不会一起执行?因此这个想法就造成了堆叠注入。而union injection(联合注入)也是将两条语句合并成一起,两者有什么区别么?
区别就在于union或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行任意的语句,例如:
用户输入1;DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select *from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
随便注入:
可以看到查询页面返回一些数据
输入1’ 发现不回显,然后1’#显示正常,应该存在sql注入了
试一下1’ or 1=1#
可以看到返回了数据
正常流程order by
可以看到order by 2的时候是正常回显了,order by 3就出错了,只有2个字段
这时候用union select进行联合查询
返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了
这时候想到堆叠注入,试一下
可以看到成功了,存在堆叠注入,
我们再直接show tables来查询下,试下能不能查询出表
可以看到有两张表,下面分别来看下两张表有什么字段
0’; show columns from words ;#
0';desc `1919810931114514`;#
注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符
可以看到1919810931114514中有我们想要的flag字段
现在常规方法基本就结束了,要想获得flag就必须来点骚姿势了
因为这里有两张表,会县内容肯定是从word这张表中回显的,那我们怎么才能让它回显flag所在的表呢
内部查询语句类似 : select id, data from word where id =
(这里从上面的对word列的查询可以看到它是有两列,id和data)
然后1919810931114514只有一个flag字段
这时候虽然有强大的正则过滤,但没有过滤alert和rename关键字
这时候我们就可以已下面的骚姿势进行注入:
1.将words表改名为word1或其它任意名字
2.1919810931114514改名为words
3.将新的word表插入一列,列名为id
4.将flag列改名为data
构造payload
1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
0';rename table words to words1;rename table
1919810931114514to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
作者:Artd33
链接:https://www.jianshu.com/p/6c6a44517dd7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
接着我们再用1’ or 1=1 #,查询就得到flag
可以看下现在数据库的表
总结
这里用sqlmap跑过的话可以发现能跑出数据表名那些,当时也没深度思考它的过滤规则,现在来看因为没有过滤show,和常用函数,所以sqlmap也能跑出一些数据
show 的使用,前面对sql使用的时候,show 可能只用过show tables, show databases 这里还用到了show columns和结合from来使用
堆叠注入,堆叠注入在原理上还是十分好懂的,但是还是有些生疏,后面再结合sqli靶场练习下
这里的骚姿势才是获取flag的关键啊,修改表名和字段名…这种操作我也是第一次遇到…看别人writeup的时候看到alert,都没一下反应过来…