随便注释一道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’ 发现不回显,然后1’#显示正常,应该存在sql注入了

    堆叠注入(网强杯随便注) - 图2

    试一下1’ or 1=1#

    堆叠注入(网强杯随便注) - 图3

    可以看到返回了数据

    正常流程order by

    堆叠注入(网强杯随便注) - 图4

    可以看到order by 2的时候是正常回显了,order by 3就出错了,只有2个字段

    这时候用union select进行联合查询

    堆叠注入(网强杯随便注) - 图5

    返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了

    这时候想到堆叠注入,试一下

    堆叠注入(网强杯随便注) - 图6

    可以看到成功了,存在堆叠注入,

    我们再直接show tables来查询下,试下能不能查询出表

    堆叠注入(网强杯随便注) - 图7

    可以看到有两张表,下面分别来看下两张表有什么字段

    0’; show columns from words ;#

    堆叠注入(网强杯随便注) - 图8

    1. 0';desc `1919810931114514`;#

    注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符

    堆叠注入(网强杯随便注) - 图9

    可以看到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 table1919810931114514to 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

    堆叠注入(网强杯随便注) - 图10

    可以看下现在数据库的表

    堆叠注入(网强杯随便注) - 图11

    堆叠注入(网强杯随便注) - 图12

    总结

    这里用sqlmap跑过的话可以发现能跑出数据表名那些,当时也没深度思考它的过滤规则,现在来看因为没有过滤show,和常用函数,所以sqlmap也能跑出一些数据

    show 的使用,前面对sql使用的时候,show 可能只用过show tables, show databases 这里还用到了show columns和结合from来使用

    堆叠注入,堆叠注入在原理上还是十分好懂的,但是还是有些生疏,后面再结合sqli靶场练习下

    这里的骚姿势才是获取flag的关键啊,修改表名和字段名…这种操作我也是第一次遇到…看别人writeup的时候看到alert,都没一下反应过来…