第一关:单引号错误
SQL的注入最终是为了拿到数据库的文件或者数据。
刚进页面,显示需要输入id。
于是我们使用在地址栏后面加上 ?id=1
第二行的黄色字体是我自己添加的内容,表示被传入mysql执行的语句(方便我加深理解),绿色字体是正常显示的内容。
如果你也想要显示此语句,可以在安装目录下的此页面的php当中,加入这条语句
echo “$sql
”
- 判断有无注入点:
老规矩:加上and 1=1;and 1=2,看一下回显有没有不同。没有!说明其在sql中不是单纯应用数值作为参数。
尝试闭合符号闭合参数。闭合符号有四种:‘、"、’)、")
依据:id是否有被作为可控制的参数传入后台执行
因此我们依次尝试
?id=1‘、?id=1‘)、?id=1"、?id=1")
(自行尝试,然后理解一下如果没有错误回显,如何判断闭合符号)
当?id=1‘、?id=1‘)时页面报错, near ‘‘1’’ LIMIT 0,1’ at line 1
第一个和最后一个引号之间的是报错内容,1’是我们传进去的,1前后面还有一个引号,说明闭合符号是 ‘ ,传入sql中执行的内容是字符串类型的。
LIMIT 0,1:作为参数的意思是从第0条数据开始,只显示一条数据。
因此
也可以再尝试?id=1"、?id=1") 增加判断准确定性 ——显示正常。说明单引号为闭合符号。且id=1dasdasdas时,与id=1显示一致,说明后面字符被sql忽略,说明id参数为数字字符型,非字符型。
?id=1‘ and’1‘=’1和?id=1‘ and’1‘=’2
前者正常,后者报错。回显不一致。说明存在注入点。
2. 判断列数
猜列数有多少段:order by 数字。后面跟着‘limit 0,1直接用#或–+注释掉(也是绕过),注意#需要换成url编码后的%23输入到地址栏中
不一一演示了。在我这里,数字大于4会报错,小于等于4不会出错。所以列数为4。
- 接下来就是注入的目的了,拿到数据库数据。
使用union查询语句(联合查询)。前面语句要报错才能正常执行union之后的语句。
2,3回复有显示,说明2,3两个点的数据可以出现,因此可以注入。
我们据此可以爆出所有的当前数据库、数据库版本、当前用户。
数据库版本再5.0以上时,因为information_schema数据库里面拥有这些所有的数据字段,还可以爆出所有数据库名,所有用户名,所有字段名。
使用语句
?id=-1’ union select 1,group(schema_name),3,4 from information_schema.schemata–+
?id=-1’ union select 1,group(table_name),3,4 from information_schema.tables where table_shcema=‘security’–+
?id=-1’ union select 1,group(column_name),3,4 from information_schema.columns where table_schema=‘security’ and table_name=‘users’
至此,数据已经完全展现在你眼前了
- 还可以下载数据,写入数据(写入需要修改my.ini文件),我没去下载,不演示了(PS:不知道可不可以)
load_file()
into outfile()或者into dumpfile()
题外话:没有securoty这个数据库,以及security的users用户表里面没有数据这件事,需要自己手动去数据库里面添加,这不算是第一关的内容,但确实是刚开始坑能会遇到的问题。