Low等级
查看正常的页面,如图1.1,发现返回的结果只有一句“User ID exists in the database.”,并不能回馈数据库中的信息,说明是盲注。
图1.1
查看一个异常ID所对应的页面,如图1.2所示。
图1.2
经过多次的猜测,发现是单引号引起的注入,如图1.3所示。
图1.3
根据图1.1和1.2的返回结果,我们可以注入一些布尔盲注和时间盲注来进行判断数据库是否存在对应的数据。如图1.4所示,可以看得到database()的长度是等于4的。这里用到的一个函数是length函数,是用来求长度的函数。
图1.4
猜database()数据库的名字,如图1.5所示,首先判断首字符的ascii的值是大于64的。这里用到的函数是substr函数,是用来切割字符串的,其中第一个参数是原字符串,第二个参数是从第几个开始切割,第三个参数则是指明要切割后的字符串的长度。
图1.5
猜首字符的ascii的值是小于122的,如图1.6所示。
图1.6
根据二分法,找到了首字符的ascii的值是100,即首字母是d,如图1.7所示。
图1.7
根据同样的方法,我们可以猜到了整个database()的名字,如图1.8-1.10,即数据库名字是dvwa。
图1.8
图1.9
图1.10
猜表,根据多次的猜测,发现第一个表的长度是9,如图1.11所示,并且发现第二个表长度是5,如图1.12所示
图1.11
图1.12
根据多次的重复猜测,发现第二个表的首个字母的ascii值是117也就是u,如图1.13所示.
图1.13
根据多次的猜测,发现其余的字母分别为sers,即database()的第二个表的名字是users。得到了表之后,我们需要猜列名,在猜列名的时候我们还需要知道它的字段数,如图1.14所示,字段为8
图1.14
知道了字段之后,我们需要一个个字段进行猜测,经过多次的猜测发现第一列的长度是7,如图1.15所示。
图1.15
知道了列名的长度之后,我们需要猜列的名字,如图1.16所示,首是u,根据相同的方法,可以猜得到整一个列名的名字是user_id
图1.16
知道了列名之后,我们就可以获取数据库的数据了,如图1.17所示,第一行的数据是1。
图1.17
查看phpmyadmin,可以猜出来的数据和正确的作比较,发现猜测确实是正确的,如图1.18所示。
图1.18
查看源码如图1.19所示,可以发现对用户的输入没有做任何处理就直接加入到sql语句中并进行执行。
图1.19
自己编写python脚本进行攻击,源码如图1.20-1.22所示,运行图如图1.23所示。
图1.20
图1.21
图1.22
图1.23
Medium等级
可以发现是下拉表单的形式并且是POST方式的,我们构造一个poc,可以发现提交正常,如图2.1。
图2.1
经过多次的单引号、双引号的测试,发现不是字符型而是数值型。如图2.1所示。
图2.1
猜database()的长度,如图2.2所示。发现执行成功,说明没有对用户此时的输入进行处理。下面的暴库、暴表、暴列以及暴数据的过程和Low一致,这里就不再演示了。
图2.2
根据Low等级暴数据的方式,进行Mediun等级暴数据,如图2.3所示,可以发现成功暴了数据。
图2.3
查看源码,如图2.4所示,可以发现和Low等级一致,就是有Get方式换成了Post方式提交。
图2.4
High等级
可以发现High等级在新的窗口中输入id,任何返回的结果是在原始的窗口中的,结果提交一次简单的数据可以发现,是Post方式的交的,根据BurpSuite抓包或者直接按F12查看页面的id标签,构造一个poc,如图3.1所示。
图3.1
结果判断数字型的方式进行猜测,发现确实是数字型的注入,如图3.2所示。
图3.2
下面的暴库、暴表、暴列的步骤和Medium等级完全一致,这里给出直接暴数据的步骤,如图3.3所示。
图3.3
查看源码如图3.4所示,可以发现没有对用户的输入进行任何处理,只是检验了cookie值。
图3.4
Impossible等级
查看源码如图4.1所示,可以发现使用PDO和预处理来对用户的输入进行处理,就我所学到的已经规避了sql注入了,这里还用了检验token值,防止csrf攻击。