这是我真正意义上来讲作的第一道SQL题目,感受从这个题目里仍是能学到好多东西的,这里记录一下这个题目的writeup和在其中学到的东西
link
:https://www.ichunqiu.com/battalion Web分类下的SQL前端
进入这个模拟环境以后,会获得一个提示为flag在数据库中,这时候查看url栏能够发现
嗯这个就有SQL注入内味了,而后试一下id=2或者id=3,发现id=2时候能够出来提示为test,而后再日后就什么都不出来了,这时候我先伪装id后面的东西是一个数字变量,输入id=1 and 1=1
,发现网页给出提示是这是SQL注入代码,这说明这个网站是有对SQL注入作基本的防御的,因此如今的问题就变成了如何绕过服务器的过滤规则。mysql
对这些的绕过通常的操做是sql
id=1 && 1=1
,发现并无报错,这说明咱们成功进行了注入的第一步。这时候咱们能够发现,颇有可能该数据库仅对咱们展现了表中某一列的数据,因此如今就要判断这个表到底有几列,这里使用的方法是order by
。url里输入id=1 order by 1
,报错提示这是sql注入代码,因此如今要进行进一步的绕过select
变为SELect
(本题中没用)/*!...*/
中,例如/*!order*/
(本题中没用)replace()
函数,所以能够输入selselectect
,在通过waf处理后变为select
(本题中没用)/**/
,反单引号
,()
,回车
等进行代替(本题中暂时不用考虑)like xxx
和rlike xxx
和= xxx
是等价的(本题中暂不用考虑)sel<>ect
进行绕过(本题有用)order
不要分割为了or<>der
由于这样又会引入or
,如今咱们输入ord<>er by x
进行尝试,发现最多到order by 3
就中止了,这说明这个表只有3列。如今咱们就须要找出具体的flag位置,这就涉及到对mysql数据库结构的了解。Mysql数据库里面有一个数据库叫information_schema,这个数据库中不少有用的信息都存在这个里面数据库
知道这些东西以后,咱们如今要找flag,我认为flag多半是在这个数据库里面,首先咱们查看一下当先数据库的名称,由于已知查询到的数据是3列,如今咱们要计算,输出在前端的究竟是哪一列的数据,这里咱们构造一个payload为?id=1 un<>ion sel<>ect 1,2,3
,发现输出的有2,那么能够确定输出在前端的就是第二列。
如今咱们想要知道这个表在哪一个数据库,因此就能够构造一个payload为?id=1 un<>ion sel<>ect 1,database(),3
,获得前端的返回结果为
如今咱们就要查找这个sqli数据库中存在哪些表,在前面咱们说过,表的信息存在tables中,因此这里构造一个payload为?id=1 un<>ion sel<>ect 1,table_name,3 from information_schema.tables whe<>re table_schema='sqli'
,而后能够获得该数据库中有两张表,一个是info,一个是users
如今咱们分别查一下这两个表里面都有哪些列,信息从columns里面查到,这时候咱们能够构造payload为?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='users'
和?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='info'
,分别以下所示:
服务器
好吧看了一下列名称,居然都有flag这个东西,那只能一个表一个表找了,首先找一下第一个表users
,这时候咱们能够构造payload为?id=1 un<>ion sel<>ect 1,flag_9c861b688330,3 fr<>om users
,可是发现并出不来任何东西。。感到疑惑,好吧那就试下一个构造payload为?id=1 un<>ion sel<>ect 1,flAg_T5ZNdrm,3 fr<>om info
,这时候出来结果了,以下所示:
而后复制这个flag交差,就ok啦!函数
这是第一次作sql注入的题,虽然这个题比较简单,可是总的来讲我仍是学到了很多东西的,好比Mysql数据库中的表结构和sql注入的绕过等,我以为仍是颇有教育意义的。网站